栈的应用——计算表达式

挺久之前写的一个作业,ACM选修课的,用栈实现的计算表达式,有两种,一种是将表达式转换为后缀表达式再计算,一种是直接计算中缀表达式,下面是代码。

(1)转后缀再计算:

#include<stack> #include<iostream> using namespace std; int main() { stack <char> s1; stack <int> s2; int i=0,s,v1,v2,v3; char p[50]; cin.getline(p,50); cout<<'='; while(p[i]!='\0') { s=0; switch(p[i]) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': while( (p[i]>='0') && (p[i]<='9') ) { s=s*10+(p[i]-'0'); i++; } s2.push(s); i--; break; case '+': case '-': if( (s1.empty()) || (s1.top()=='(') ) s1.push(p[i]); else { while( (!s1.empty()) && (s1.top()!='(') ) { switch(s1.top()) { case '+': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v1+v2; s2.push(v3); break; case '-': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v2-v1; s2.push(v3); break; case '*': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v1*v2; s2.push(v3); break; case '/': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v2/v1; s2.push(v3); break; }//switch s1.pop(); }//while s1.push(p[i]); }//else break; case '*': case '/': if( (s1.empty()) || (s1.top()=='(') || (s1.top()=='+') || (s1.top()=='-') ) s1.push(p[i]); else { while( (!s1.empty()) && (s1.top()!='(') && (s1.top()!='+') && (s1.top()!='-') ) { switch(s1.top()) { case '*': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v1*v2; s2.push(v3); break; case '/': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v2/v1; s2.push(v3); break; } s1.pop(); } s1.push(p[i]); } break; case '(': s1.push(p[i]); break; case ')': while( (!s1.empty()) && (s1.top()!='(') ) { switch(s1.top()) { case '+': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v1+v2; s2.push(v3); break; case '-': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v2-v1; s2.push(v3); break; case '*': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v1*v2; s2.push(v3); break; case '/': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v2/v1; s2.push(v3); break; } s1.pop(); } if(!s1.empty())//pop掉左括号 s1.pop(); break; }//switch i++; }//while while(!s1.empty()) { switch(s1.top()) { case '+': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v1+v2; s2.push(v3); break; case '-': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v2-v1; s2.push(v3); break; case '*': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v1*v2; s2.push(v3); break; case '/': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v2/v1; s2.push(v3); break; }//switch s1.pop(); }//while v3=s2.top(); s2.pop(); cout<<v3<<endl; return 0; }

输入: 55+34*(3*(3+6))-12

55+34*(3*(3+6))-12 55 34 3 3 6 + * * + 12 -=961 Press any key to continue


(2)中缀直接计算

include<stack> #include<iostream> using namespace std; int main() { stack <char> s1; stack <int> s2; int i=0,s,v1,v2,v3; char p[50]; cin.getline(p,50); cout<<'='; while(p[i]!='\0') { s=0; switch(p[i]) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': while( (p[i]>='0') && (p[i]<='9') ) { s=s*10+(p[i]-'0'); i++; } s2.push(s); i--; break; case '+': case '-': if( (s1.empty()) || (s1.top()=='(') ) s1.push(p[i]); else { while( (!s1.empty()) && (s1.top()!='(') ) { switch(s1.top()) { case '+': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v1+v2; s2.push(v3); break; case '-': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v2-v1; s2.push(v3); break; case '*': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v1*v2; s2.push(v3); break; case '/': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v2/v1; s2.push(v3); break; }//switch s1.pop(); }//while s1.push(p[i]); }//else break; case '*': case '/': if( (s1.empty()) || (s1.top()=='(') || (s1.top()=='+') || (s1.top()=='-') ) s1.push(p[i]); else { while( (!s1.empty()) && (s1.top()!='(') && (s1.top()!='+') && (s1.top()!='-') ) { switch(s1.top()) { case '*': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v1*v2; s2.push(v3); break; case '/': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v2/v1; s2.push(v3); break; } s1.pop(); } s1.push(p[i]); } break; case '(': s1.push(p[i]); break; case ')': while( (!s1.empty()) && (s1.top()!='(') ) { switch(s1.top()) { case '+': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v1+v2; s2.push(v3); break; case '-': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v2-v1; s2.push(v3); break; case '*': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v1*v2; s2.push(v3); break; case '/': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v2/v1; s2.push(v3); break; } s1.pop(); } if(!s1.empty())//pop掉左括号 s1.pop(); break; }//switch i++; }//while while(!s1.empty()) { switch(s1.top()) { case '+': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v1+v2; s2.push(v3); break; case '-': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v2-v1; s2.push(v3); break; case '*': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v1*v2; s2.push(v3); break; case '/': v1=s2.top(); s2.pop(); v2=s2.top(); s2.pop(); v3=v2/v1; s2.push(v3); break; }//switch s1.pop(); }//while v3=s2.top(); s2.pop(); cout<<v3<<endl; return 0; }

输入: 55+34*(3*(3+6))-12

55+34*(3*(3+6))-12 =961 Press any key to continue


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值