ACM CSP竞赛笔记(七)——数据结构-栈与前中后缀表达式

参考课程来源于我高中信息竞赛邱老师的课程:

【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()就是能看到的数量了。