当前位置: 首页 > article >正文

【数据结构-队列】力扣232. 用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):

实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false

说明:
你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

示例 1:
输入:
[“MyQueue”, “push”, “push”, “peek”, “pop”, “empty”]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 1, 1, false]

解释:
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false

提示:
1 <= x <= 9
最多调用 100 次 push、pop、peek 和 empty
假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)

双栈模拟

class MyQueue {
public:
    stack<int> st1;
    stack<int> st2;
    MyQueue() {
        
    }
    
    void push(int x) {
        st1.push(x);
    }
    
    int pop() {
        while(!st1.empty()){
            st2.push(st1.top());
            st1.pop();
        }
        int r = st2.top();
        st2.pop();
        while(!st2.empty()){
            st1.push(st2.top());
            st2.pop();
        }
        return r;
    }
    
    int peek() {
        while(!st1.empty()){
            st2.push(st1.top());
            st1.pop();
        }
        int r = st2.top();
        while(!st2.empty()){
            st1.push(st2.top());
            st2.pop();
        }
        return r;
    }
    
    bool empty() {
        return st1.empty();
    }
};

在上一题用队列模拟栈中,我们在push中进行相对复杂的操作来使得队列中的元素排列顺序和栈类似,然后我们将队列的头看成栈顶来进行pop。而在这一题栈模拟队列中,如果使用那种做法会发现我们没办法将栈元素的排列顺序和队列类似,所以我们就只需要按栈的顺序来排列元素,然后我们在pop的时候,将栈底的元素弹出就行。那么要将栈底的元素弹出,我们就需要另外一个栈st2来辅助,我们将栈st1的元素全部推入st2中,然后st1的栈底元素就在st2的栈顶,将st2栈顶的元素pop并返回后,再将st2的元素推入st1中,这时候就可以实现st1栈底元素被pop掉。


http://www.kler.cn/a/407488.html

相关文章:

  • 2024年亚太地区数学建模大赛A题-复杂场景下水下图像增强技术的研究
  • 从 HTML 到 CSS:开启网页样式之旅(二)—— 深入探索 CSS 选择器的奥秘
  • 高精度计算题目合集
  • apr共享内存
  • [UE5学习] 一、使用源代码安装UE5.4
  • 一种简单高效的RTSP流在线检测方法,不需要再过渡拉流就可以获取设备状态以及对应音视频通道与编码格式
  • 洛谷 P1722 矩阵 II C语言 记忆化搜索
  • 对比学习——moco
  • Android 工厂设计模式的使用:咖啡机,可以做拿铁,可以做美式等等。
  • SCTransNet验证测试
  • 解决报错:rror: error:0308010C:digital envelope routines::unsupported
  • 利用软件实现发票的批量查验,并自动截图保存 91发票查验助手
  • 【C++】关于指针Free和链表循环释放的问题
  • websocket消息的实现
  • 【公开笔记】小白学习vue3完整版
  • 智能体来了:构建用于具有结构化输出的内容审核的智能 AI Agent 智能体
  • 【Isaac Sim】加载自带模型或示例时报 Isaac Sim is not responding
  • 联想ThinkServer服务器主要硬件驱动下载
  • 【单片机基础】如何选择合适的低功耗单片机
  • YOLOv11融合[NeurlS2022]递归门控卷积gnconv模块及相关改进思路
  • 10 —— Webpack打包模式
  • Linux使用经验记录
  • 韦东山hal库 使用光敏传感器控制蜂鸣器
  • GoZero对接GPT接口的设计与实现:问题分析与解决
  • 深入探索:JavaScript中实现乱序函数的艺术
  • 电脑禁用U盘的四种简单方法(电脑怎么阻止u盘使用)