参考课程来源于我高中信息竞赛邱老师的课程:
【13-4-1 数据结构:栈】 https://www.bilibili.com/video/BV1GZ4y1n724/?share_source=copy_web\&vd_source=2c56c6a2645587b49d62e5b12b253dca
完整CSP ACM板子可以去资源下载,我设置的0积分免费下,如果下不了了可以去B站私我
栈

STL栈

前中后缀表达式

中缀转前缀

中缀转后缀

前后缀表达式的计算
前缀表达式的计算
前缀从右往左压入栈,遇到运算符弹栈计算。

后缀表达式的计算
后缀从左往右压入栈,遇到运算发弹栈计算。注意顺序是次栈顶<运算>栈顶。

练习 P1449
https://www.luogu.com.cn/problem/P1449
cpp
#include <iostream>
#include <stack>
#include <string>
using namespace std;
//
int main() {
string s;
getline(cin, s);
stack<long long> st;
string num = "";
for (char c : s) {
//第一个可能是数字也可能是负号,要完整接受一个多位数字:先通过一次性收集齐"."前的字符,然后一次stod变成数字
if (isdigit(c)) {
num += c;
}
else if (c == '.') {//如果遇到是.就std
st.push(stoll(num));
num.clear();//输入完要清空
}
else if (c == '@') {
break;
}
else {
long long op2 = st.top(); st.pop();
long long op1 = st.top(); st.pop();
if (c == '+') {
//cout << op1 <<"+"<< op2 <<"="<<op1+op2 << endl;
st.push(op1 + op2);
}
else if (c == '-') {
//cout << op1 << "-" << op2 << "=" << op1 - op2 << endl;
st.push(op1 - op2);
}
else if (c == '*') {
//cout << op1 << "*" << op2 << "=" << op1 * op2 << endl;
st.push(op1 * op2);
}
else {
//cout << op1 << "/" << op2 << "=" << op1 / op2 << endl;
st.push(op1 / op2);
}
}
}
cout << st.top() << endl;
}
单调栈(下一个比自己大的元素 NGE问题)
牛只能看到之前比自己高的牛,比如53214 对于5号牛,只能看到5.对于4号牛能看到532,是一个单调递减栈。每次只需要pop调比自己矮的牛,那么s.size()就是能看到的数量了。