Stack and queue

栈与队列:C++实现的核心线性数据结构

线性数据结构——元素按顺序排列——是编程的基石。其中,栈(Stack)队列(Queue) 因其简洁性及在算法中的广泛应用(如栈用于深度优先搜索,队列用于广度优先搜索)而脱颖而出。

1. 栈:后进先出(LIFO)

栈是一种“单端”结构,元素的添加和移除都在同一端(称为“栈顶”)进行。可以想象一叠盘子:你只能将新盘子放在最上面,或者拿走最上面的盘子。

核心特性:LIFO

最后插入的元素将最先被移除。形式化表示为:

\[\text{插入顺序: } e_1 \rightarrow e_2 \rightarrow e_3 \quad \Rightarrow \quad \text{移除顺序: } e_3 \rightarrow e_2 \rightarrow e_1 \]

核心操作

所有栈操作的时间复杂度均为 O(1)(常数时间),因为它们只修改或访问栈顶元素。

操作 描述 边界情况处理
push(x) 将元素 x 添加到栈顶。 无(假设数组空间足够)。
pop() 移除栈顶元素。 如果栈为空,则不执行任何操作。
top() 返回栈顶元素(不移除它)。 如果为空则行为未定义(由用户逻辑处理)。
empty() 检查栈是否没有元素。 如果为空返回 true,否则返回 false

栈实现

c++代码:

#include <iostream>

using namespace std;

const int N = 1e5 + 10;

int n;

template<typename T>
struct Stack {
    int idx;
    T a[N];

    bool empty() {
        return idx == 0;
    }

    void push(T x) {
        a[ ++ idx] = x;
    }

    void pop() {
        if (idx) idx -- ;
    }

    T top() {
        return a[idx];
    }
};

Stack<int> s;

int main() {
    cin >> n;

    while (n -- ) {
        int opt, x;
        cin >> opt;
        if (opt == 1) {
            cin >> x;
            s.push(x);
        } 
        else if (opt == 2) s.pop();
        else if (opt == 3) cout << (s.empty() ? "YES" : "NO") << endl;
        else cout << s.top() << endl;
    }

    return 0;
}

2. 队列:先进先出(FIFO)

队列是一种“双端”结构,元素从一端(称为“队尾”)添加,从另一端(称为“队首”)移除。可以想象商店的排队:最先加入队伍的人将最先得到服务。

核心特性:FIFO

最先插入的元素将最先被移除。形式化表示为:

\[\text{插入顺序: } e_1 \rightarrow e_2 \rightarrow e_3 \quad \Rightarrow \quad \text{移除顺序: } e_1 \rightarrow e_2 \rightarrow e_3 \]

核心操作

与栈类似,所有队列操作的时间复杂度均为 O(1) ——它们只修改队首或队尾。

操作 描述 边界情况处理
push(x) 将元素 x 添加到队尾。 无(假设数组空间足够)。
pop() 移除队首的元素。 如果队列为空,则不执行任何操作。
front() 返回队首元素(不移除它)。 如果为空则行为未定义(由用户逻辑处理)。
empty() 检查队列是否没有元素。 如果为空返回 true,否则返回 false

队列实现

c++ 代码:

#include <iostream>

using namespace std;

const int N = 1e5 + 10;

int n;

template<typename T>
struct Queue {
    int head, tail;
    T a[N];

    Queue() {
        head = tail = 0;
    }

    void push(T x) {
        a[tail ++ ] = x;
    }

    void pop() {
        if (head < tail) head ++ ;
    }

    bool empty() {
        return head == tail;
    }

    T front() {
        return a[head];
    }
};

Queue<int> q;

int main() {
    cin >> n;

    while (n -- ) {
        int opt, x;
        cin >> opt;
        if (opt == 1) {
            cin >> x;
            q.push(x);
        } 
        else if (opt == 2) q.pop();
        else if (opt == 3) cout << (q.empty() ? "YES" : "NO") << endl;
        else cout << q.front() << endl;
    }

    return 0;
}

3. 栈与队列的关键区别

理解何时使用哪种结构至关重要。以下是它们的对比:

方面 队列
顺序原则 LIFO (后进先出) FIFO (先进先出)
访问端 单端(栈顶) 双端(队首 = 移除,队尾 = 添加)
核心方法 push(), pop(), top() push(), pop(), front()
常见应用场景 - 函数调用栈
- 撤销/重做功能
- 深度优先搜索(DFS)算法
- 任务调度
- 打印队列
- 广度优先搜索(BFS)算法
posted @ 2025-08-29 17:58  wz150432  阅读(7)  评论(0)    收藏  举报