表达式求值 数据结构
数据结构中栈的应用
1 #include<iostream> 2 #include<cstring> 3 4 using namespace std; 5 6 char str[1000]; 7 char ans[1000]; 8 struct fu 9 { 10 char ff[1000]; 11 int top; 12 }fse; 13 struct data 14 { 15 int da[1000]; 16 int top; 17 }dse; 18 int you(char a) 19 { 20 switch(a) 21 { 22 case '#':return -1; 23 case '(': return 0; 24 case '*': 25 case '/': return 2; 26 case '+': 27 case '-': return 1; 28 default: return -3; 29 } 30 } 31 void tran() 32 { 33 int cont=strlen(str); 34 str[cont]='#'; 35 int pos=0; 36 fse.top=0; 37 for(int i = 0; i <= cont; ) 38 { 39 int flag=0; 40 while(str[i]>='0' && str[i]<='9') 41 { 42 if(pos&&ans[pos-1]!=' '&&(ans[pos-1]<'0'||ans[pos-1]>'9')) 43 ans[pos++]=' '; 44 ans[pos++]=str[i]; 45 flag=1; 46 i++; 47 } 48 if(flag) 49 ans[pos++]=' '; 50 if(str[i]==')') 51 { 52 while(fse.ff[fse.top-1]!='(') 53 ans[pos++]=fse.ff[--fse.top]; 54 fse.top--; 55 } 56 else 57 if(you(str[i])==-1) 58 { 59 while(fse.top) 60 { 61 ans[pos++]=fse.ff[--fse.top]; 62 } 63 } 64 else 65 if(fse.top==0) 66 fse.ff[fse.top++]=str[i]; 67 else 68 if(you(str[i])==0) 69 fse.ff[fse.top++]=str[i]; 70 else 71 { 72 if(you(str[i])>you(fse.ff[fse.top-1])) 73 fse.ff[fse.top++]=str[i]; 74 else 75 if(you(str[i]<=you(fse.ff[fse.top-1]))) 76 { 77 while(fse.top && you(str[i]<=you(fse.ff[fse.top-1]))) 78 ans[pos++]=fse.ff[fse.top-1],fse.top--; 79 fse.ff[fse.top++]=str[i]; 80 } 81 } 82 i++; 83 } 84 ans[pos]=0; 85 } 86 int read(int i) 87 { 88 int x=0; 89 while(ans[i]>='0'&&ans[i]<='9') 90 x=x*10+(ans[i]-'0'),i++; 91 dse.da[dse.top++]=x; 92 return i; 93 } 94 int post() 95 { 96 dse.top=0; 97 int cont = strlen(ans); 98 for(int i = 0; i < cont;) 99 { 100 if(ans[i]>='0'&&ans[i]<='9') 101 i=read(i); 102 else if(ans[i]=='+') 103 dse.da[dse.top-2]+=dse.da[dse.top-1],dse.top--; 104 else if(ans[i]=='-') 105 dse.da[dse.top-2]-=dse.da[dse.top-1],dse.top--; 106 else if(ans[i]=='*') 107 dse.da[dse.top-2]*=dse.da[dse.top-1],dse.top--; 108 else if(ans[i]=='/') 109 dse.da[dse.top-2]/=dse.da[dse.top-1],dse.top--; 110 i++; 111 if(ans[i]==' ') 112 i++; 113 114 } 115 return dse.da[0]; 116 } 117 int main() 118 { 119 while(cin>>str) 120 { 121 tran(); 122 cout<<post()<<endl; 123 } 124 return 0; 125 }