跳转至

前置知识

一维数组、stack

目标

利用栈解决表达式求值的问题

What

栈是一种线性数据结构 支持两种基本操作:进栈、出栈 栈的修改与访问,是按照先进后出的原则进行

img

img

Why

栈的应用:回溯、递归、深度优先搜索

How

用数组模拟栈

// 0 入栈
// 1 出栈
// 2 输出栈顶

#include <bits/stdc++.h>

using namespace std;

int stk[110], tt;
int n, op, x;

int main() {
    cin >> n;
    while (n--) {
        cin >> op;

        if (op == 0) {cin >> x; stk[++tt] = x;}
        if (op == 1 && op > 0) tt--;
        if (op == 2 && op > 0) cout << stk[tt] << '\n';
    }

    return 0;
}

用STL中的栈

// 0 入栈
// 1 出栈
// 2 输出栈顶

#include <bits/stdc++.h>

using namespace std;

stack<int> stk;
int n, op, x;

int main() {
    cin >> n;
    while (n--) {
        cin >> op;

        if (op == 0) {cin >> x; stk.push(x);}
        if (op == 1 && !stk.empty()) stk.pop();
        if (op == 2 && !stk.empty()) cout << stk.top() << '\n';
    }

    return 0;
}

总结

表达式括号匹配(stack),只判断括号是否匹配 后缀表达式的值,给你的是后缀,但也需要用getline读入,拆数字 表达式求值,给你的中缀表达式,一个字符串读入,也需要拆数字,需要处理运算符优先级 中缀表达式值(expr),还要判断表达式的合法性,最麻烦,但也最锻炼人

参考

https://oi-wiki.org/ds/stack/