2021-11-28 常用算法

# 一、算法思想

栈的实现只要在数组的基础上额外维护一个栈顶下标即可。

# 二、算法模板

C++

// tt 表示栈顶
int stk[N], tt = 0;

// 向栈顶插入元素
stk[++tt] = x;

// 从栈顶弹出元素
tt--;

// 获取栈顶的值
stk[tt];

// 判断栈是否为空
tt > 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 三、代码实战

# AcWing 0828


题目:模拟栈

实现一个栈,栈初始为空,支持四种操作:

  1. push x – 向栈顶插入一个数 xx
  2. pop – 从栈顶弹出一个数;
  3. empty – 判断栈是否为空;
  4. query – 查询栈顶元素。

现在要对栈进行 MM 个操作,其中的每个操作 33 和操作 44 都要输出相应的结果。

输入格式

第一行包含整数 MM,表示操作次数。

接下来 MM 行,每行包含一个操作命令,操作命令为 push xpopemptyquery 中的一种。

输出格式

对于每个 emptyquery 操作都要输出一个查询结果,每个结果占一行。

其中,empty 操作的查询结果为 YESNOquery 操作的查询结果为一个整数,表示栈顶元素的值。

数据范围

1M1000001 \le M \le 100000
1x1091 \le x \le 10^9
所有操作保证合法。所有操作保证合法。

输入样例:

10

push 5

query

push 6

pop

query

pop

empty

push 4

query

empty

输出样例:

5

5

YES

4

NO

解答代码:

#include <iostream>

using namespace std;

const int N = 100010;

// tt 表示栈顶
int stk[N], tt = 0;

int main()
{
    int m;
    cin >> m;
    
    while (m--) {
        string op;
        cin >> op;
        if (op == "push") {
            int x;
            cin >> x;
            stk[++tt] = x;
        } else if (op == "pop") {
            tt--;
        } else if (op == "empty") {
            if (tt > 0) cout << "NO" << endl;
            else cout << "YES" << endl;
        } else {
            cout << stk[tt] << endl;
        }
    }
    
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Last Updated: 2023-01-28 4:31:25