STL Stack(栈)学习笔记 + 洛谷 P1449 后缀表达式
稍微看了看刘汝佳的白皮书,“实用主义”的STL实在是香到我了,而且在实验室大佬的推荐下我开始了stl的学习。
每篇附带一个题目方便理解,那行,直接开始。
毕竟是实用主义,所以就按照给的题目的例子来理解需要用到的函数,算法题目里用的多的函数也会拿出来晒一晒,其他就无所谓啦。
栈(stack)
- push、pop、size、empty
- push 入栈一个元素
- pop 出栈一个元素,pop无返回值
- top 取栈顶元素
- size 查看元素个数
- empty() 当队列为空时,返回true
(来一张直观的图)
下面就进入题目!
P1449 后缀表达式
题目描述
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.+@。’@’为表达式的结束符号。‘.’为操作数的结束符号。
输入格式
输入:后缀表达式
输出格式
输出:表达式的值
输入输出样例
输入 #1
3.5.2.-*7.+@
输出 #1
16
说明/提示
字符串长度,1000内。
这其实就是经典的计算器的原理,利用栈来储存数字,遇到运算符号就提出运算,再将结果压回栈中,达成目的。
#include <iostream>
#include <stack>
using namespace std;
int tmp = 0, res = 0;
stack num;
int main()
{
char temp1;
while (1) {
cin >> temp1;
if (temp1 == '@') {//结束判定
goto point;
}
if (temp1 >= '0' && temp1 <= '9') {
tmp *= 10;
tmp += temp1 - '0';
}
else if (temp1 == '.') {//数据入栈
num.push(tmp);
tmp = 0;
}
else if (temp1 == '+') {//以下是四种符号的运算,注意顺序,是后取出的数做被运算数
int temp2 = num.top();
num.pop();
int temp3 = num.top();
num.pop();//取出两运算数
res = temp3 + temp2;//计算
num.push(res);//压回栈中
}
else if (temp1 == '-') {
int temp2 = num.top();
num.pop();
int temp3 = num.top();
num.pop();
res = temp3 - temp2;
num.push(res);
}
else if (temp1 == '*') {
int temp2 = num.top();
num.pop();
int temp3 = num.top();
num.pop();
res = temp3 * temp2;
num.push(res);
}
else if (temp1 == '/') {
int temp2 = num.top();
num.pop();
int temp3 = num.top();
num.pop();
res = temp3 / temp2;
num.push(res);
}
}
point:
cout << res;//这里直接输出num.top也是可以的,因为栈中只剩下我们算出的答案了。
}