1.栈的建立与常见用法
#include <stack>//头文件
//...
stack <A> s;//建立一个类型为A,名字叫s的栈
1.1. s.push(a):把 a 压入栈。
栈 s:
| a a a |
|---|
s.push(2020)
1.2. s.top():访问栈顶
栈 s:
| 2020 2020 2020(被访问) |
|---|
| a a a |
1.3. s.pop():弹出栈顶
栈 s:
| a a a |
|---|
2020 2020 2020(被弹出)
2.表达式树的概念
下图
[
1
]
^{[1]}
[1]是一棵表达式树,对应的后缀表达式是4 1 5 2 - * + 6 3 / -。

可以看出,每个运算符结点都有左子树和右子树,每个数字结点都是叶子节点。
表达式树的中序遍历就是中缀表达式。
运算方式:左子树的结果 运算符 右子树的结果
于是就可以得出代码:
3.code
//P1449
#include <iostream>
#include <stack>
using namespace std;
stack <int> n;
int s=0;
int main(){
char ch;
while(1){
cin>>ch;
if(ch<='9'&&ch>='0') s=s*10+ch-'0';//累计
else if(ch=='.'){
n.push(s);//压栈
s=0;//s清零
}
else if(ch!='@'){
int a1=n.top();n.pop();int a2=n.top();n.pop();//弹出栈顶两个元素
if(ch=='+') n.push(a1+a2);
if(ch=='-') n.push(a2-a1);
if(ch=='*') n.push(a1*a2);
if(ch=='/') n.push(a2/a1);
//压入结果
}
else break;
}
cout<<n.top();
return 0;
}
4.参考文献
[ 1 ] ^{[1]} [1] 图片来源
282



被折叠的 条评论
为什么被折叠?



