表达式求值 数据结构

数据结构中栈的应用

  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 }

 

转载于:https://www.cnblogs.com/Xycdada/p/6443082.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值