题目链接:http://lx.lanqiao.cn/problem.page?gpid=T419
题意:计算表达式,只包含加减乖除和括号,其中除表示整除。
解题方案:通过两个栈,一个符号栈和一个数值栈将中缀表达式转换成后缀表达式并计算。
代码参考:http://www.cnblogs.com/z-y-p/p/3676945.html
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
#define FOR(i,k,n) for(int i=k;i<n;i++)
#define FORR(i,k,n) for(int i=k;i<=n;i++)
#define scan(a) scanf("%d",&a)
#define scann(a,b) scanf("%d%d",&a,&b)
#define scannn(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define mst(a,n) memset(a,n,sizeof(a))
#define ll long long
#define N 505
#define mod 1000000007
#define INF 0x3f3f3f3f
const double eps=1e-8;
const double pi=acos(-1.0);
string s;
stack<char> fu;//符号栈,只会存在(+-*/五种
stack<int> shu;//数值栈
void js1()//碰到+-)这三个优先级低的,将符号栈中的符号全部取出计算,直到碰到符号栈中的(
{
while(fu.top()!='(')
{
int n1=shu.top(); shu.pop();
int n2=shu.top(); shu.pop();
char op=fu.top(); fu.pop();
switch(op)
{
case '+':
n2+=n1;
break;
case '-':
n2-=n1;
break;
case '*':
n2*=n1;
break;
case '/':
n2/=n1;
break;
}
shu.push(n2);
}
}
void js2()//碰到*/这两个优先级高的,只将栈顶的*/取出来计算
{
while(fu.top()=='*'||fu.top()=='/')
{
int n1=shu.top(); shu.pop();
int n2=shu.top(); shu.pop();
char op=fu.top(); fu.pop();
switch(op)
{
case '*':
n2*=n1;
break;
case '/':
n2/=n1;
break;
}
shu.push(n2);
}
}
int main()
{
cin>>s;
s='('+s+')';//加入左边界,省去栈空判断
//加入右边界,从而使表达式遍历完后,弹出数值栈和符号栈最后的内容进行计算
for(int i=0;s[i];i++)
{
if(s[i]>='0'&&s[i]<='9')
{
int n=0;
while(s[i]>='0'&&s[i]<='9') n=n*10+s[i]-'0',i++;
shu.push(n);
}
switch(s[i])
{
case '+':
js1();
fu.push(s[i]);
break;
case '-':
js1();
fu.push(s[i]);
break;
case '*':
js2();
fu.push(s[i]);
break;
case '/':
js2();
fu.push(s[i]);
break;
case '(':
fu.push(s[i]);
break;
case ')':
js1();
fu.pop();
break;
}
}
cout<<shu.top()<<endl;
return 0;
}