原题其实可以归纳为一个计算不带括号的小学算术题
计算机计算数学表达式需要转化成后缀表达式——逆波兰式
#include<iostream>
#include<stack>
using namespace std;
int operate(int first, int second, char op)//定义四则运算
{
int res = 0;
switch (op)
{
case '+':
res = first + second;
break;
case '-':
res = first - second;
break;
case '*':
res = first*second;
break;
case '/':
res = first / second;
break;
default:
break;
}
return res;
}
int sol(string s)//计算后缀表达式的值
{
stack<int> st;//操作数堆栈
for (int i=0;i<s.length();++i)
{
if (isdigit(s[i]))//如果是数字就压栈
{
st.push(s[i] - '0');
}
else//遇到字符就弹出两个操作数进行运算
{
int a = st.top();
st.pop();
int b = st.top();
st.pop();
st.push(operate(b, a, s[i]));
}
}
return st.empty() ? 0 : st.top();//最后的结果为栈顶元素
}
int hash(char c)//运算符优先级
{
int ans=0;
if(c=='*'||c=='/')
ans=2;
else if(c=='-'||c=='+')
ans=1;
return ans;
}
int main()
{
string s,t;
int k=0;
char p[1000];
cin>>s;
for(int i=0;i<s.length();++i)
{
if(s[i]<='9'&&s[i]>='0')
t+=s[i];
else if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/')
{
if(k==0)
{
p[++k]=s[i];
}
else if(hash(s[i])>hash(p[k]))
{
p[++k]=s[i];
}
else
{
while(hash(s[i])<=hash(p[k]))
{
t+=p[k--];
}
p[++k]=s[i];
}
}
else if(s[i]=='(')
{
p[++k]='(';
}
else if(s[i]==')')
{
while(p[k]!='(')
{
t+=p[k--];
}
k--;
}
}
while(k>0)
{
t+=p[k--];
}
cout<<sol(t);
return 0;
}