中缀表达式求值问题(栈的应用)
Posted XJX
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中缀表达式求值问题(栈的应用)相关的知识,希望对你有一定的参考价值。
1 #include <iostream> 2 #include<stdlib.h> 3 4 using namespace std; 5 6 #define STACK_INIT_SIZE 100 7 #define STACKINCREASE 10 8 9 //为了简化函数,数据栈和符号栈用了一种结构体(虽然我知道可以用共用体解决问题,嫌烦), 10 //由此导致的后果是接下来所有的运算过程中不允许出现小数,而且由于是利用ASCII表来储存整数, 11 //所以要求运算数以及运算过程中数不能超过表中的最大值,暂时没有考虑负数问题,而且不能在输入时出现两位数 12 //以上问题全是由于我把数字当成字符处理的结果,单纯图个方便 13 typedef struct 14 { 15 char *base; 16 char *top; 17 int stacksize; 18 }SqStack; 19 20 21 int InitStack(SqStack &S) 22 { 23 S.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char)); 24 if(!S.base) 25 { 26 cout<<"分配空间失败!"; 27 exit(-1); 28 } 29 S.top=S.base; 30 S.stacksize=STACK_INIT_SIZE; 31 return 0; 32 } 33 34 35 int Push(SqStack &S,char e) 36 { 37 if((S.top-S.base)>=STACK_INIT_SIZE) 38 { 39 S.base=(char *)realloc(S.base,(STACK_INIT_SIZE+STACKINCREASE)*sizeof(char)); 40 if(!S.base) 41 { 42 cout<<"分配空间失败!"; 43 exit(-1); 44 } 45 S.top=S.base+STACK_INIT_SIZE; 46 S.stacksize=STACK_INIT_SIZE+STACKINCREASE; 47 } 48 *(S.top)=e;//结构体 49 S.top++; 50 return 0; 51 } 52 53 54 int Pop(SqStack &S,char &e) 55 { 56 if(S.base==S.top) 57 { 58 cout<<"栈为空!"; 59 exit(0); 60 } 61 S.top--; 62 e=*(S.top); 63 return 0; 64 } 65 66 int GetTop(SqStack &S,char &e) 67 { 68 if(S.base==S.top) 69 { 70 cout<<"栈为空!"; 71 return 0; 72 } 73 else 74 { 75 e=*(S.top-1); 76 return 1; 77 } 78 } 79 80 81 int EmptyStack(SqStack &S) 82 { 83 if(S.base==S.top) return 1;//stack is empty! 84 else return 0;//stack is not empty! 85 } 86 87 88 int Precede(char a,char b)//a为符号栈栈顶元素,b为待插入的元素 89 { 90 int i;//i=1入栈,i=0弹出操作符以及操作数进行计算 91 if((a==‘+‘||a==‘-‘)&&(b==‘*‘||b==‘/‘)) i=1; 92 if((a==‘+‘||a==‘-‘)&&(b==‘+‘||b==‘-‘)) i=0; 93 if((a==‘*‘||a==‘/‘)&&(b==‘*‘||b==‘/‘)) i=0; 94 if((a==‘*‘||a==‘/‘)&&(b==‘+‘||b==‘-‘)) i=0; 95 if(a==‘(‘) i=1; 96 return i; 97 } 98 99 int EvaluateExpression(char *p) 100 { 101 char a,b,c,d,e,f; 102 int i,j; 103 SqStack S1,S2;//S1为操作符栈,S2为操作数栈 104 InitStack(S1); 105 InitStack(S2); 106 c=*p++; 107 while(c!=‘#‘) 108 { 109 if(c>=48&&c<=57) Push(S2,c);//输入为数字 110 if(c==‘(‘) Push(S1,c); //输入为左括号 111 if(c==‘)‘)//输入为右括号 112 { 113 if(!EmptyStack(S1)) GetTop(S1,e); 114 while(e!=‘(‘) 115 { 116 Pop(S2,a); 117 Pop(S2,b); 118 Pop(S1,d); 119 if(d==‘+‘) j=(b-48)+(a-48); 120 if(d==‘-‘) j=(b-48)-(a-48); 121 if(d==‘*‘) j=(b-48)*(a-48); 122 if(d==‘/‘) 123 { 124 if(a-48) j=(b-48)/(a-48); 125 else {cout<<"计算过程出现除数为零的错误!"<<endl; return 0;} 126 } 127 f=char(j+48); 128 Push(S2,f); 129 if(!EmptyStack(S1)) GetTop(S1,e);//直到遇到左括号 130 if(e==‘(‘) Pop(S1,e); 131 } 132 } 133 if(c==‘+‘||c==‘-‘||c==‘*‘||c==‘/‘) 134 { 135 if(EmptyStack(S1)) Push(S1,c); 136 else 137 { 138 GetTop(S1,e); 139 i=Precede(e,c); 140 if(i==0) 141 { 142 Pop(S2,a); 143 Pop(S2,b); 144 Pop(S1,d); 145 if(d==‘+‘) j=(b-48)+(a-48); 146 if(d==‘-‘) j=(b-48)-(a-48); 147 if(d==‘*‘) j=(b-48)*(a-48); 148 if(d==‘/‘) 149 { 150 if(a-48) j=(b-48)/(a-48); 151 else {cout<<"计算过程出现除数为零的错误!"<<endl; return 0;} 152 } 153 f=char(j+48); 154 Push(S1,c); 155 Push(S2,f); 156 } 157 if(i==1) Push(S1,c); 158 } 159 } 160 c=*p++; 161 } 162 if(!EmptyStack(S1)) 163 { 164 while(!EmptyStack(S1)) 165 { 166 Pop(S2,a); 167 Pop(S2,b); 168 Pop(S1,d); 169 if(d==‘+‘) j=(b-48)+(a-48); 170 if(d==‘-‘) j=(b-48)-(a-48); 171 if(d==‘*‘) j=(b-48)*(a-48); 172 if(d==‘/‘) j=(b-48)/(a-48); 173 f=char(j+48); 174 Push(S2,f); 175 } 176 } 177 //最后输出结果 178 Pop(S2,a); 179 i=a-48; 180 cout<<"运算结果为:"<<i<<endl; 181 return 0; 182 } 183 184 185 int main() 186 { 187 //数据测试 188 char *p1="3+2*5#";//=13 189 char *p2="2*5+3#";//=13 190 char *p3="((3+5*2)+2)/5+6/3*2+3#";//=10 191 char *p4="9+(3-1)*3+6/2#";//=18 192 EvaluateExpression(p1); 193 EvaluateExpression(p2); 194 EvaluateExpression(p3); 195 EvaluateExpression(p4); 196 return 0; 197 }
以上是关于中缀表达式求值问题(栈的应用)的主要内容,如果未能解决你的问题,请参考以下文章