#include<iostream>
#include <stack>
#include <string>
using namespace std;
void post_value(string str2);
int op(int a, int b, char ch)
{
if (ch == '+') return a + b;
if (ch == '-') return a - b;
if (ch == '*') return a * b;
if (ch == '/') return a / b;
}
//运算符
struct opChar
{
char ch; // 该结构体代表的运算符
int out; //该运算符的栈外优先级
int in; //该运算符的栈内优先级
opChar(char ch, int out, int in)
{
this->ch = ch;
this->out = out;
this->in = in;
}
};
int main()
{
opChar plus('+',2,3);
opChar sub('-',2,3);
opChar mul('*',4,5);
opChar div('/',4,5);
opChar end('#',0,0);
opChar left('(',8,1);
opChar right(')',1,-1);
string str;//输入一个中缀表达式
cin >> str;
string str2 = "";//把输出结果放到后缀表达式中去,然后对后缀表达式进行后缀表达式求值
stack<opChar> sp;
sp.push(end); // 让'#'来垫底
for (int i = 0; i < str.size(); i++)
{
if (str[i] >= 48 && str[i] <= 57)//是操作数,就直接放到后缀表达式字符串里面去
{
str2.push_back(str[i]);
}
else
{
if (str[i]==plus.ch) //如果扫描到的是加号,用扫描到的加号的栈外优先级和栈顶运算符的栈内优先级做比较,如果比之大
{
while (!sp.empty())
{
if (plus.out > sp.top().in)
{
sp.push(plus);
break;
}
else
{
str2.push_back(sp.top().ch);
sp.pop();
}
}
}
if (str[i] == sub.ch)
{
while (!sp.empty())
{
if (sub.out > sp.top().in)
{
sp.push(sub);
break;
}
else
{
str2.push_back(sp.top().ch);
sp.pop();
}
}
}
if (str[i] == mul.ch)
{
while (!sp.empty())
{
if (mul.out > sp.top().in)
{
sp.push(mul);
break;
}
else
{
str2.push_back(sp.top().ch);
sp.pop();
}
}
}
if (str[i] == div.ch)
{
while (!sp.empty())
{
if (div.out > sp.top().in)
{
sp.push(div);
break;
}
else //如果/比栈顶元素的优先级小,就弹出栈顶元素,直到/比栈顶要大
{
str2.push_back(sp.top().ch);
sp.pop();
}
}
}
if (str[i] == left.ch) //如果扫描到左括号,直接入栈
{
sp.push(left);
}
if (str[i] == right.ch) //如果是右括号
{
while (!sp.empty())//只要栈不空
{
//就消去括号
if (right.out == sp.top().in)
{
sp.pop();
break;
}
else//如果右括号比栈顶的优先级小,就出栈,直到其相等
{
str2.push_back(sp.top().ch);
sp.pop();
}
}
}
}
}
//把栈里面剩下的运算符弹出来
while (sp.top().ch!='#')
{
str2.push_back(sp.top().ch);
sp.pop();
}
//cout << str2 << endl; 得到了后缀表达式
//然后后缀表达式求值
post_value(str2);
return 0;
}
void post_value(string str)
{
stack<char> vc;
int ret;
for (int i = 0; i < str.size(); i++)
{
if (str[i] >= 48 && str[i] <= 57)//是数字
{
vc.push(str[i]);
}
else
{
int tempa = vc.top() - '0'; vc.pop();
int tempb = vc.top() - '0'; vc.pop();
ret = op(tempa, tempb, str[i]);
vc.push(ret + '0');
}
}
cout << vc.top() - '0' << endl;
}
网友评论