后缀表达式
表达式树的后序遍历
eg:
(
2
+
1
)
∗
3
=
2
1
+
3
∗
(2+1)*3= 2~1~ +~ 3~ *
(2+1)∗3=2 1 + 3 ∗
顺序存储,用栈,倒序跳出。
每次遍历到一个运算符,它的左右儿子恰好为它前面的两个元素,即栈顶的两个元素。跳出这两个元素然后按运算符运算后的结果放入栈中。
P1449 后缀表达式
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
stack<int>stk;
char op;
void eval(char op)//核心
{
int b=stk.top();stk.pop();
int a=stk.top();stk.pop();//注意先b后a的顺序(因为是逆序的)
if(op=='+') stk.push(a+b);
else if(op=='*') stk.push(a*b);
else if(op=='-') stk.push(a-b);
else stk.push(a/b);
//cout<<stk.top()<<endl;
}
int main()
{
int num=0;
while((op=getchar())!='@')
{
if(op>='0'&&op<='9') num*=10,num+=op-'0';
else if(op=='.'){ stk.push(num),num=0;}
else eval(op);
}
cout<<stk.top()<<endl;
return 0;
}
LeetCode 150. 逆波兰表达式求值
class Solution {
public:
stack<int>stk;
void eval(string c)
{
int b=stk.top();stk.pop();
int a=stk.top();stk.pop();
if(c=="-") stk.push(a-b);
else if(c=="+") stk.push(a+b);
else if(c=="*") stk.push(a*b);
else if(c=="/") stk.push(a/b);
}
int evalRPN(vector<string>& tokens) {
for(int i=0;i<tokens.size();i++)
{
string s=tokens[i];
if(s=="+"||s=="-"||s=="*"||s=="/") eval(s);
else stk.push(atoi(s.c_str()));
}
return stk.top();
}
};