1、中缀(infix)表达式(expression)转换为后缀(postfix)表达式:(注:为了方便起见,表达式对象的输入输出均用空格分开)
首先需要从头到尾读取中缀表达式中的每一个对象,建立一个堆栈
(1)遇到操作数,直接输出;
(2)遇到运算符,当该运算符大于栈顶运算符的优先级时,将该运算符压入栈中;如果该运算符的优先级小于或等于栈顶元素的优先级时,将栈顶元素弹出并输出,并比较新的
栈顶运算符,知道该运算符大于栈顶运算符,并将该运算符压入栈中。
(3)遇到左括号,将其压入栈中;
(4)遇到右括号,将括号内的运算符依次弹出并输出,直到遇到左括号(左括号也出栈,但不输出)。
(5)若中缀表达式中的对象处理完毕,则将栈中剩余的运算符弹出并输出。
代码如下:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<stdbool.h> 4 #include<ctype.h> 5 #define MAXOP 100 6 typedef struct SNode{ 7 char *Data; 8 int Top; 9 int Maxsize; 10 }Stack; 11 12 Stack *CreateStack(int Maxsize) 13 { 14 Stack *S; 15 S=(Stack *)malloc(sizeof(struct SNode)); 16 S->Top=-1; 17 S->Data=(char *)malloc(Maxsize * sizeof(char)); 18 S->Maxsize=Maxsize; 19 return S; 20 } 21 22 bool IsFull(Stack *S) 23 { 24 return (S->Top==S->Maxsize-1); 25 } 26 27 void Push(Stack *S,char op) 28 { 29 if(!IsFull(S)) 30 { 31 S->Data[++(S->Top)]=op; 32 } 33 } 34 35 bool IsEmpty(Stack *S) 36 { 37 return (S->Top==-1); 38 } 39 40 char Pop(Stack *S) 41 { 42 char op; 43 if (!IsEmpty(S)) 44 { 45 op=S->Data[(S->Top)--]; 46 } 47 return op; 48 } //以上是建立栈,及栈的基本操作 49 50 /* 取出栈顶元素的函数 */ 51 char Top(Stack *S) 52 { 53 char op; 54 if (!IsEmpty(S)) 55 { 56 op=S->Data[(S->Top)]; 57 } 58 return op; 59 } 60 61 typedef enum {num,opr,end}Type; 62 63 /* 扫描中缀表达式中的每个对象,将其存在str数组中 。start传进去的是地址。str数组在每次函数调用的过程中其值会不断的变化*/ 64 Type GetOp(char *Expr,int *start,char *str) 65 { 66 int i=0; 67 while ((str[0]=Expr[(*start)++])==' '); //跳过表达式对象前的空格 68 while (str[i]!=' ' && str[i]!='