[LeetCode]day29 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 操作)

解题

解法一:


思路

我定义了两个栈:

  • in栈:用于存储新加入的元素。
  • out栈:用于存储即将被弹出的元素。
    引入了两个计数器:
  • numOfIn:记录 in 栈中的元素数量。
  • numOfOut:记录 out 栈中的元素数量。

进行pop操作时,先将除栈底元素的其他元素全部压入另外一个栈中,弹出栈底元素之后再压回

c 复制代码
class MyQueue {
public:
    stack<int>in;
    int numOfIn;
    stack<int>out;
    int numOfOut;
    MyQueue() {
        numOfIn=0;
        numOfOut=0;
    }
    
    void push(int x) {
        in.push(x);
        numOfIn++;
    }
    
    int pop() {
        while(numOfIn>1){
            int num=in.top();
            in.pop();
            numOfIn--;
            out.push(num);
            numOfOut++;
        }
        int re=in.top();
        in.pop();
        numOfIn--;
        while(numOfOut>0){
            int num=out.top();
            in.push(num);
            out.pop();
            numOfOut--;
            numOfIn++;
        }
        return re;
    }
    
    int peek() {
        while(numOfIn>1){
            int num=in.top();
            in.pop();
            numOfIn--;
            out.push(num);
            numOfOut++;
        }
        int re =  in.top();
        while(numOfOut>0){
            int num=out.top();
            in.push(num);
            out.pop();
            numOfOut--;
            numOfIn++;
        }
     return re;
    }
    
    bool empty() {
        return  in.empty();
    }
};

这种解法的缺点也非常明显 每次pop()peek()都会牵扯到大量数据移动 效率很低

解法二

思路:

入栈就直接进入in栈,出栈时如果out栈不为空,out栈执行pop操作,反之,In栈元素全部压入out栈中再pop

这样所有元素就不用来回倒腾啦

c 复制代码
class MyQueue {
public:
    stack<int>in;
    stack<int>out;
    MyQueue() {
       
    }
    
    void push(int x) {
        in.push(x);
        }
    
    int pop() {
        if(out.empty()){
        while(!in.empty()){
            int num;
            num=in.top();
            in.pop();
            out.push(num);
        }
        }
        int topNum=out.top();
        out.pop();
        return topNum;
    }
    
    int peek() {
      if(out.empty()){
          while (!in.empty()) {
           int num = in.top();
           in.pop();
           out.push(num);
}
    }
     return out.top();
    }
    
    bool empty(){
        return  in.empty()&&out.empty();
    }
    
};

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue* obj = new MyQueue();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->peek();
 * bool param_4 = obj->empty();
 */
相关推荐
佑白雪乐14 分钟前
<ACM进度212题>[2026-3-1,2026-3-26]
算法·leetcode
穿条秋裤到处跑18 分钟前
每日一道leetcode(2026.03.26):等和矩阵分割 II
算法·leetcode·矩阵
平凡灵感码头22 分钟前
C语言 printf 数据打印格式速查表
c语言·开发语言·算法
哔哔龙28 分钟前
Android OpenCV 实战:图片轮廓提取与重叠轮廓合并处理
android·算法
hz_zhangrl30 分钟前
CCF-GESP 等级考试 2026年3月认证C++三级真题解析
c++·算法·程序设计·gesp·gesp2026年3月·gesp c++三级
x_xbx34 分钟前
LeetCode:1. 两数之和
数据结构·算法·leetcode
x_xbx37 分钟前
LeetCode:49. 字母异位词分组
算法·leetcode·职场和发展
玲娜贝儿--努力学习买大鸡腿版1 小时前
hot 100 刷题记录(1)
数据结构·python·算法
123过去1 小时前
pixiewps使用教程
linux·网络·测试工具·算法·哈希算法
深圳市快瞳科技有限公司1 小时前
低空经济下,鸟类识别算法与无人机硬件的兼容性优化策略
算法·无人机