代码随想录算法训练10 | 栈和队列-理论基础、232.用栈实现队列、225. 用队列实现栈

本文介绍了栈和队列的基本概念,探讨了STL中的实现方式,以及如何用栈和队列进行模拟操作,包括用一个队列实现栈的实例。

栈和队列-理论基础

参考:代码随想录

栈(stack)

是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能);

STL 中栈是用什么容器实现的?

从下图中可以看出,栈的内部结构,栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现;

我们常用的SGI STL,如果没有指定底层实现的话,默认是以deque为缺省情况下栈的底层结构;

deque是一个双向队列,只要封住一段,只开通另一端就可以实现栈的逻辑了;

我们也可以指定vector为栈的底层实现,初始化语句如下:

std::stack<int, std::vector<int> > third;  // 使用vector为底层容器的栈

队列(queue)

队列的情况与栈是一样的;

队列中先进先出的数据结构,同样不允许有遍历行为,不提供迭代器, SGI STL中队列一样是以deque为缺省情况下的底部结构;

也可以指定list 为起底层实现,初始化queue的语句如下:

std::queue<int, std::list<int>> third; // 定义以list为底层容器的队列

232.用栈实现队列 

大家可以先看视频,了解一下模拟的过程,然后写代码会轻松很多。

题目链接/文章讲解/视频讲解:代码随想录

#include <iostream>
#include <stack>

using namespace std;

class MyQueue {
public:
    stack<int> stIn;  // 输入栈,用于入队操作
    stack<int> stOut; // 输出栈,用于出队操作

    // 构造函数,初始化对象
    MyQueue() {}
    // 入队操作,将元素 x 推入队列的尾部
    void push(int x) { stIn.push(x); }

    // 出队操作,删除队列的头部元素并返回
    int pop() {
        // 只有当stOut为空的时候,再从stIn里导入数据(导入stIn全部数据)
        if (stOut.empty()) {
            // 从stIn导入数据直到stIn为空
            while (!stIn.empty()) {
                stOut.push(stIn.top());
                stIn.pop();
            }
        }
        // 返回 stOut 的栈顶元素(即队列的头部元素)
        int result = stOut.top();
        stOut.pop();
        return result;
    }

    // 获取队列的头部元素,但不删除
    int peek() {
        // this 指的是调用该函数的 MyQueue 类的对象
        int res = this->pop(); // 直接使用已有的pop函数
        stOut.push(res);       // 因为pop函数弹出了元素res,所以再添加回去
        return res;
    }

    /** Returns whether the queue is empty. */
    bool empty() { return stIn.empty() && stOut.empty(); }
};

int main() {
    MyQueue queue;

    // 入队操作
    queue.push(1);
    queue.push(2);

    // 获取头部元素,但不删除
    cout << "Peek: " << queue.peek() << endl;

    // 出队操作
    cout << "Pop: " << queue.pop() << endl;

    // 检查队列是否为空
    cout << "Is the queue empty? " << (queue.empty() ? "Yes" : "No") << endl;

    cin.get();
    return 0;
}

  225. 用队列实现栈 

可以大家惯性思维,以为还要两个队列来模拟栈,其实只用一个队列就可以模拟栈了。 

建议大家掌握一个队列的方法,更简单一些,可以先看视频讲解

题目链接/文章讲解/视频讲解:代码随想录

### Java 中队列实现及相关练习 #### (Stack) 的基本概念与实现 是一种遵循 **后进先出(LIFO, Last In First Out)** 原则的数据结构。在 Java 中,可以使用 `Deque` 接口或者数组来模拟的行为。 以下是通过 `Deque` 实现的一个简单的例子: ```java import java.util.ArrayDeque; import java.util.Deque; public class StackExample { private Deque<Integer> stack; public StackExample() { this.stack = new ArrayDeque<>(); } public void push(int value) { stack.addFirst(value); } public int pop() { return stack.removeFirst(); } public boolean isEmpty() { return stack.isEmpty(); } } ``` 此代码展示了如何利用 `Deque` 来创建一个简单的[^1]。 --- #### 队列 (Queue) 的基本概念与实现 队列是一种遵循 **先进先出(FIFO, First In First Out)** 原则的数据结构。Java 提供了多种内置类用于操作队列,比如 `LinkedList` `PriorityQueue`。 下面是一个基于 `LinkedList` 的队列实现示例: ```java import java.util.LinkedList; import java.util.Queue; public class QueueExample { private Queue<Integer> queue; public QueueExample() { this.queue = new LinkedList<>(); } public void enqueue(int value) { queue.offer(value); } public int dequeue() { return queue.poll(); } public boolean isEmpty() { return queue.isEmpty(); } } ``` 上述代码片段说明了如何使用 `LinkedList` 构建 FIFO 行为的队列--- #### 使用队列解决实际问题 一些经典的算法题目可以通过队列得到优雅的解决方案: 1. **用实现队列** 可以借助两个完成队列的功能。入队时将数据压入第一个;出队时如果第二个为空,则将第一个的所有元素依次弹出并压入第二个,最后从第二个弹出顶部元素即可[^5]。 2. **滑动窗口最大值** 这一问题是典型的单调队列应用场景之一。维护一个双端队列,在遍历过程中动态调整队首队尾的位置,从而快速获取当前窗口的最大值[^3]。 3. **有效括号匹配** 利用判断给定字符串中的括号是否合法。每当遇到左括号将其推入中,而碰到右括号时尝试从顶取出配对的左括号进行验证[^2]。 4. **逆波兰表达式求值** 同样依赖于的操作逻辑解析 RPN(Reverse Polish Notation)。对于每一个运算符,都需要从里提取最近两次存储的结果执行相应计算后再存回内等待后续处理。 5. **前 K 个高频元素** 结合哈希表统计频率以及优先级队列筛选最高频次项共同作用下达成目标效果。 --- #### 关于刷题技巧 针对 LeetCode 上涉及队列类型的习题,推荐按照如下策略开展学习活动: - 熟悉各种 ADT(抽象数据类型),包括但不限于标准库里的容器组件及其特性差异; - 多加实践动手编写程序解决问题的能力训练过程之中不断积累经验教训总结规律形成自己的套路模式; - 定期回顾错题集加深印象巩固薄弱环节直至完全掌握为止[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值