队列

2021-11-28 常用算法 队列

# 一、算法思想

队列的实现只要在数组的基础上额外维护队头和队尾下标即可。

# 二、算法模板

C++

// hh 表示队头,tt 表示队尾
int q[N], hh = 0, tt = -1;

// 向队尾插入元素
q[++tt] = x;

// 从队头弹出元素
hh++;

// 获取队头元素
q[hh];

// 判断队列是否为空
hh <= tt
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 三、代码实战

# AcWing 0829


题目:模拟队列

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

  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 6

empty

query

pop

empty

push 3

push 4

pop

query

push 6

输出样例:

NO

6

YES

4

解答代码:

#include <iostream>

using namespace std;

const int N = 100010;

// hh 表示队头,tt 表示队尾
int q[N], hh = 0, tt = -1;

int main()
{
    int m;
    cin >> m;
    
    while (m--) {
        string op;
        cin >> op;
        if (op == "push") {
            int x;
            cin >> x;
            q[++tt] = x;
        } else if (op == "pop") {
            hh++;
        } else if (op == "empty") {
            if (hh <= tt) cout << "NO" << endl;
            else cout << "YES" << endl;
        } else {
            cout << q[hh] << 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