C语言- 基础数据结构和算法 - 09 栈的应用_中缀表达式转后缀表达式20220611
2022/6/12 5:20:27
本文主要是介绍C语言- 基础数据结构和算法 - 09 栈的应用_中缀表达式转后缀表达式20220611,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
09 栈的应用_中缀表达式转后缀表达式20220611
听黑马程序员教程《基础数据结构和算法 (C版本)》,
照着老师所讲抄的,
视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1
喜欢的朋友可以去看看,欢迎大家一起交流学习。
09 栈的应用_中缀表达式转后缀表达式20220611_main.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "LinkStack.c" typedef struct MYCHAR{ LinkNode* node; char* pAddres; // 放字符地址,因为每个字符都有一个地址。 int index; // 记录位置 }MyChar; // 判断是否是数字 int IsNumber(char c){ return c >='0' && c <='9'; } // 输出数字 void NumberOperate(char* p){ printf("%c",*p); } // 判断是否左括号和右括号 int IsLeft(char c){ return c == '('; } int IsRight(char c){ return c == ')'; } // 判断是否运算符号 int IsOperator(char c){ return c=='+' || c=='-' || c=='*' || c=='/'; } // 返回运算符的优先级 int GetPriority(char c){ if(c=='*' || c == '/'){ return 2; } if(c=='+'|| c=='-'){ return 1; } return 0; } // 创建MyChar MyChar* CreateMyChar(char* p){ MyChar* mychar = (MyChar*)malloc(sizeof(MyChar)); mychar->pAddres = p; return mychar; } // 左括号进栈 void LeftOperate(LinkStack* stack,char* p){ Push_LinkStack(stack,(LinkNode*)CreateMyChar(p)); } // 右括号操作 弹出并输出,直到匹配左括号 void RightOperate(LinkStack* stack){ // 先判断栈中有没有元素,有则弹, while(Size_LinkStack(stack)>0){ MyChar* mychar = (MyChar*)Top_LinkStack(stack); // 如果匹配左括号,则出栈 if(IsLeft(*(mychar->pAddres))){ Pop_LinkStack(stack); break; } // 不匹配左括号,则输出,弹出 printf("%c",*(mychar->pAddres)); Pop_LinkStack(stack); free(mychar); } } // 运算符号的操作 void OperatorOperator(LinkStack* stack,char* p){ // 先取出栈顶符号 MyChar* mychar = (MyChar*)malloc(sizeof(MyChar)); if(mychar==NULL){ Push_LinkStack(stack,(LinkNode*)CreateMyChar(p)); return; } // 如果栈顶优先级低于当前字符的优先级,则直接入栈 if(GetPriority(*(mychar->pAddres))< GetPriority(*p)){ Push_LinkStack(stack,(LinkNode*)CreateMyChar(p)); return; } // 如果优先级不低, else{ while(Size_LinkStack(stack) > 0){ MyChar* mychar2 = (MyChar*)malloc(sizeof(MyChar)); // 如果优先级低,当前符号入栈 if(GetPriority(*(mychar2->pAddres))<GetPriority(*p)){ Push_LinkStack(stack,(LinkNode*)CreateMyChar(p)); break; } // 输出 printf("%c",*(mychar2->pAddres)); // 弹出 Pop_LinkStack(stack); // 释放 free(mychar2); } } } int main(){ printf("好好学习,天天向上~!\t\t\t 09_栈的应用_中缀表达式转后缀表达式20220611\n\n\n"); char* str ="8+(3-1)*5"; char* p = str; // 创建栈 LinkStack* stack = Init_LinkStack(); while(*p !='\0'){ // 如果是数字,直接输出 if(IsNumber(*p)){ // 直接输出 NumberOperate(p); } // 如果是左括号,进栈 if(IsLeft(*p)){ LeftOperate(stack,p); } // 如果是右括号,则将栈顶符号弹出并输出,直到匹配左括号 if(IsRight(*p)){ RightOperate(stack); } // 如果是运算符号 if(IsOperator(*p)){ OperatorOperator(stack,p); } p++; } while(Size_LinkStack(stack)>0){ MyChar* mychar = (MyChar*)Top_LinkStack(stack); printf("%c",*(mychar->pAddres)); Pop_LinkStack(stack); free(mychar); } // 以上输出结果为 831-5*+ printf("\n\n"); system("pause"); return 0; }
LinkStack.c
1 #ifndef LINKSTACK_H 2 #define LINKSTACK_H 3 4 #include <stdio.h> 5 #include <stdlib.h> 6 7 8 // 链式栈的节点 9 typedef struct LINKNODE{ 10 struct LINKNODE* next; 11 }LinkNode; 12 13 // 链式栈 14 15 typedef struct LINKSTACK{ 16 LinkNode HeadNode; //头节点 17 int size; 18 }LinkStack; 19 20 // 初始化 21 LinkStack* Init_LinkStack(); 22 // 入栈 23 void Push_LinkStack(LinkStack* stack,LinkNode* data); 24 // 出栈 (删除第一个元素) 25 void Pop_LinkStack(LinkStack* stack); 26 // 返回栈顶元素 27 LinkNode* Top_LinkStack(LinkStack* stack); 28 // 返回栈元素的个数 29 int Size_LinkStack(LinkStack* stack); 30 // 清空栈 31 void Clear_LinkStack(LinkStack* stack); 32 // 销毁栈 33 void FreeSpace_LinkStack(LinkStack* stack); 34 35 36 37 #endif
LinkStack.h
1 #include "LinkStack.h" 2 3 4 // 初始化 5 LinkStack* Init_LinkStack(){ 6 7 // 开内存 8 LinkStack* stack = (LinkStack*)malloc(sizeof(LinkStack)); 9 // 初始化 10 stack->HeadNode.next = NULL; 11 stack->size = 0; 12 13 return stack; 14 } 15 16 // 入栈 17 void Push_LinkStack(LinkStack* stack,LinkNode* data){ 18 19 if(stack == NULL){ 20 return; 21 } 22 if(data == NULL){ 23 return; 24 } 25 26 data->next = stack->HeadNode.next; 27 stack->HeadNode.next = data; 28 29 stack->size++; 30 31 } 32 33 // 出栈 (删除第一个元素) 34 void Pop_LinkStack(LinkStack* stack){ 35 36 if(stack == NULL){ 37 return ; 38 } 39 if(stack->size==0){ 40 return ; 41 } 42 43 // 第一个有效节点 44 LinkNode* pNext = stack->HeadNode.next; 45 stack->HeadNode.next = pNext->next; // pNext.next为第一个有效节点的下一个节点 46 47 stack->size--; 48 49 } 50 51 // 返回栈顶元素 52 LinkNode* Top_LinkStack(LinkStack* stack){ 53 54 if(stack == NULL){ 55 return NULL; 56 } 57 if(stack->size==0){ 58 return NULL; 59 } 60 61 return stack->HeadNode.next; 62 } 63 64 // 返回栈元素的个数 65 int Size_LinkStack(LinkStack* stack){ 66 if(stack == NULL){ 67 return -1; 68 } 69 return stack->size; 70 } 71 72 // 清空栈 73 void Clear_LinkStack(LinkStack* stack){ 74 75 if(stack == NULL){ 76 return; 77 } 78 stack->HeadNode.next = NULL; 79 stack->size=0; 80 81 } 82 83 // 销毁栈 84 void FreeSpace_LinkStack(LinkStack* stack){ 85 86 if(stack == NULL){ 87 return; 88 } 89 90 free(stack); 91 92 93 }
这篇关于C语言- 基础数据结构和算法 - 09 栈的应用_中缀表达式转后缀表达式20220611的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-26怎么使用nsenter命令进入容器?-icode9专业技术文章分享
- 2024-12-26导入文件提示存在乱码,请确定使用的是UTF-8编码怎么解决?-icode9专业技术文章分享
- 2024-12-26csv文件怎么设置编码?-icode9专业技术文章分享
- 2024-12-25TypeScript基础知识详解
- 2024-12-25安卓NDK 是什么?-icode9专业技术文章分享
- 2024-12-25caddy 可以定义日志到 文件吗?-icode9专业技术文章分享
- 2024-12-25wordfence如何设置密码规则?-icode9专业技术文章分享
- 2024-12-25有哪些方法可以实现 DLL 文件路径的管理?-icode9专业技术文章分享
- 2024-12-25错误信息 "At least one element in the source array could not be cast down to the destination array-icode9专业技术文章分享
- 2024-12-25'flutter' 不是内部或外部命令,也不是可运行的程序 或批处理文件。错误信息提示什么意思?-icode9专业技术文章分享