中缀表达式求值
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 *q) 100 { 101 char *p = q; 102 char a,b,c,d,e,f; 103 int i,j; 104 SqStack S1,S2;//S1为操作符栈,S2为操作数栈 105 InitStack(S1); 106 InitStack(S2); 107 c=*p++; 108 while(c!='#') 109 { 110 if(c>=48&&c<=57) Push(S2,c);//输入为数字 111 if(c=='(') Push(S1,c); //输入为左括号 112 if(c==')')//输入为右括号 113 { 114 if(!EmptyStack(S1)) GetTop(S1,e); 115 while(e!='(') 116 { 117 Pop(S2,a); 118 Pop(S2,b); 119 Pop(S1,d); 120 if(d=='+') j=(b-48)+(a-48); 121 if(d=='-') j=(b-48)-(a-48); 122 if(d=='*') j=(b-48)*(a-48); 123 if(d=='/') 124 { 125 if(a-48) j=(b-48)/(a-48); 126 else {cout<<"计算过程出现除数为零的错误!"<<endl; return 0;} 127 } 128 f=char(j+48); 129 Push(S2,f); 130 if(!EmptyStack(S1)) GetTop(S1,e);//直到遇到左括号 131 if(e=='(') Pop(S1,e); 132 } 133 } 134 if(c=='+'||c=='-'||c=='*'||c=='/') 135 { 136 if(EmptyStack(S1)) Push(S1,c); 137 else 138 { 139 GetTop(S1,e); 140 i=Precede(e,c); 141 if(i==0) 142 { 143 Pop(S2,a); 144 Pop(S2,b); 145 Pop(S1,d); 146 if(d=='+') j=(b-48)+(a-48); 147 if(d=='-') j=(b-48)-(a-48); 148 if(d=='*') j=(b-48)*(a-48); 149 if(d=='/') 150 { 151 if(a-48) j=(b-48)/(a-48); 152 else {cout<<"计算过程出现除数为零的错误!"<<endl; return 0;} 153 } 154 f=char(j+48); 155 Push(S1,c); 156 Push(S2,f); 157 } 158 if(i==1) Push(S1,c); 159 } 160 } 161 c=*p++; 162 } 163 if(!EmptyStack(S1)) 164 { 165 while(!EmptyStack(S1)) 166 { 167 Pop(S2,a); 168 Pop(S2,b); 169 Pop(S1,d); 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 if(d=='/') j=(b-48)/(a-48); 174 f=char(j+48); 175 Push(S2,f); 176 } 177 } 178 //最后输出结果 179 Pop(S2,a); 180 i=a-48; 181 while(*q!='#') cout << *q++; 182 cout << " 的运算结果为:"<<i<<endl; 183 return 0; 184 } 185 186 187 int main() 188 { 189 //数据测试 190 char *p1="3+2*5#";//=13 191 char *p2="2*5+3#";//=13 192 char *p3="((3+5*2)+2)/5+6/3*2+3#";//=10 193 char *p4="9+(3-1)*3+6/2#";//=18 194 EvaluateExpression(p1); 195 EvaluateExpression(p2); 196 EvaluateExpression(p3); 197 EvaluateExpression(p4); 198 return 0; 199 }
思路参考:http://www.cnblogs.com/dolphin0520/p/3708602.html
只有0和1的世界是简单的