首先要构造栈,目的是将操作符存入栈中。
有三种情况,优先级一样,优先级比栈顶的高,优先级比栈顶的低。
优先级比栈顶的低或一样,则栈顶的输出,出栈,再将此运算符进栈。
优先级比栈顶的高,则入栈。
‘( ’优先级最高 ,入栈。‘)’不入栈。栈内一直出栈直到‘( ’。
最后直接输出栈内所有元素。
最终输出后缀表达式。
将这个表达式存入另一个栈。这时实现了逆序存储。然后从栈顶遍历,遇到数字存入新的栈,遇到操作符,实用switch实现运算。出栈两次,进栈一次。进栈的为运算结果。最终输出栈顶元素。栈只剩下一个元素。
1 #include <stdio.h> 2 #include <cstdlib> 3 #include <string.h> 4 #define STACK_INIT_SIZE 100 5 #define STACKINCREMENT 10 6 7 typedef struct { 8 int *base; 9 int *top; 10 int stacksize; 11 }SqStack; 12 13 int Init(SqStack &S) 14 { 15 S.base = (int *)malloc(STACK_INIT_SIZE *sizeof(int)); 16 if (!S.base) return 0; 17 S.top = S.base; 18 S.stacksize = STACK_INIT_SIZE; 19 return 1; 20 }//Init 21 22 int Push(SqStack &S,int e) 23 { 24 if(S.top - S.base >= S.stacksize){ 25 S.base = (int *)realloc(S.base,(S.stacksize + STACKINCREMENT)*sizeof(int)); 26 if(!S.base) return 0; 27 S.top = S.base + S.stacksize; 28 S.stacksize += STACKINCREMENT; 29 }//if 30 *S.top = e; 31 S.top++; 32 return 1; 33 }//Push 34 35 int Pop(SqStack &S) 36 { 37 if (S.top == S.base) return 0; 38 --S.top; 39 return 1; 40 } 41 42 int getTop(SqStack S) 43 { 44 return *(S.top - 1); 45 } 46 47 int main() 48 { 49 SqStack S,M,N,P; 50 Init(S); 51 Init(M); 52 Init(N); 53 Init(P); 54 char s[100]; 55 int i; 56 gets(s); 57 for(i = 0;i < strlen(s);i++) 58 { 59 switch(s[i]) 60 { 61 case '+': 62 //加法优先级最低 63 { 64 if(getTop(S) == '*' || getTop(S) == '/' || getTop(S) == '+' || getTop(S) == '-') 65 { 66 printf("%c",getTop(S)); 67 Push(M,getTop(S)); 68 Pop(S); 69 Push(S,'+'); 70 } 71 72 else 73 Push(S,'+'); 74 } 75 break; 76 case '-': 77 //减法和加法类似 78 { 79 if(getTop(S) == '*' || getTop(S) == '/' || getTop(S) == '+' || getTop(S) == '-') 80 { 81 printf("%c",getTop(S)); 82 Push(M,getTop(S)); 83 Pop(S); 84 Push(S,'-'); 85 } 86 else 87 Push(S,'-'); 88 } 89 break; 90 case '*': 91 { 92 if(getTop(S) == '*' || getTop(S) == '/') 93 { 94 printf("%c",getTop(S)); 95 Push(M,getTop(S)); 96 Pop(S); 97 Push(S,'*'); 98 } 99 else 100 { 101 Push(S,'*'); 102 } 103 }//case 104 break; 105 case '/': 106 { 107 if(getTop(S) == '*' || getTop(S) == '/') 108 { 109 printf("%c",getTop(S)); 110 Push(M,getTop(S)); 111 Pop(S); 112 Push(S,'/'); 113 } 114 else 115 { 116 Push(S,'/'); 117 } 118 }//case 119 break; 120 case '(': 121 Push(S,'('); 122 break; 123 case ')': 124 { 125 while (getTop(S) != '(') 126 { 127 printf("%c",getTop(S)); 128 Push(M,getTop(S)); 129 Pop(S); 130 } 131 Pop(S); 132 } 133 break; 134 default: 135 { 136 printf("%c",s[i]); 137 Push(M,s[i]); 138 } 139 }//switch 140 }//for 141 while(S.base != S.top) 142 { 143 printf("%c",*(S.top - 1)); 144 Push(M,*(S.top - 1)); 145 Pop(S); 146 } 147 printf(" "); 148 // printf("%c ",*(M.top - 1)); 149 while(M.base != M.top) 150 { 151 Push(N,*(M.top-1)); 152 Pop(M); 153 }//while 154 155 int p = 0; 156 while(N.base != N.top) 157 { 158 if(*(N.top - 1) != '+' && *(N.top - 1) != '-' && *(N.top - 1) != '*' && *(N.top - 1) != '/') 159 { 160 *(N.top - 1) = (int)*(N.top - 1) - 48; 161 *P.top = *(N.top - 1); 162 --N.top; 163 ++P.top; 164 } 165 166 else 167 { 168 switch(*(N.top - 1)) 169 { 170 171 case '+': 172 { 173 p = *(P.top - 2) + *(P.top - 1); 174 Pop(P); 175 Pop(P); 176 Push(P,p); 177 } 178 break; 179 case '-': 180 { 181 p = *(P.top - 2) - *(P.top - 1); 182 Pop(P); 183 Pop(P); 184 Push(P,p); 185 } 186 break; 187 case '*': 188 { 189 p = *(P.top - 2) * *(P.top - 1); 190 Pop(P); 191 Pop(P); 192 Push(P,p); 193 } 194 break; 195 case '/': 196 { 197 p = *(P.top - 2) / *(P.top - 1); 198 Pop(P); 199 Pop(P); 200 Push(P,p); 201 } 202 break; 203 }//switch 204 --N.top; 205 }//else 206 207 }//while 208 printf("表达式结果为:"); 209 printf("%d ",*P.base); 210 return 0; 211 212 }//main