处理表达式主要是对优先级以及括号的判断
1.运算符栈顶的优先级小于加入的时,需要将所有的不评级的取出并计算,
2.当遇到)时,需要括号内的运算全部处理
2.其他情况全部加入运算符栈和数据栈
代码:
#include<iostream>
#include<cstdlib>
#include<stack>
using namespace std;
typedef long long int ll;
const int MAXN =10;
stack<char> ss;//运算符栈
stack<double>st;//数据栈
char s[30];
int main() {
cin.getline(s,30 ,'#');
for (int i = 0; i < strlen(s); i++)
{
if (s[i]== ')')
{
while (!ss.empty())
{
char a = ss.top();
if (a != '(')
{
ss.pop();
double b, c;
b = st.top(); st.pop();
c = st.top(); st.pop();
if (a == '*')st.push(b * c);
else if (a == '/')st.push(double(c / b));
else if (a == '+')st.push(c + b);
else if (a == '-')st.push(c - b);
}
else
{
ss.pop();
break;
}
}
}
else if (s[i] == '+' || s[i] == '-')
{
//printf("3\n");
while (!ss.empty())
{
char a = ss.top();
if (a != '(')
{
double b, c;
b = st.top(); st.pop();
c = st.top(); st.pop();
if (a == '*')st.push(b * c);
else st.push(double(c * 1.0 / b));
ss.pop();
}
else
{
//printf("1\n");
break;
}
}
ss.push(s[i]);
}
else if (s[i] == '/' || s[i] == '*'||s[i] == '(')
{
ss.push(s[i]);
}
else
{
double sum = 0;
while (s[i] <= '9' && s[i] >= '0')
{
sum = sum * 10 + s[i] - '0';
i++;
}
i--;
st.push(sum);
}
}
/*printf_s("%d %d\n", ss.size(), st.size());
while (ss.size())
{
printf("%c", ss.top());
ss.pop();
}*/
while (!ss.empty())
{
char b = ss.top(); ss.pop();
if (b == '(')continue;
double a, c;
a = st.top(); st.pop();
c = st.top() ; st.pop();
switch (b)
{
case '+':st.push(a + c); break;
case '-':st.push(c - a); break;
case '*':st.push(c * a); break;
case '/':st.push(c*1.0 / a); break;
default:break;
}
}
double su;
su = st.top();
printf_s("%.2lf", su);
//(56-20)/(1+5)
}