[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();
 */
相关推荐
八股文领域大手子19 分钟前
JVM垃圾回收器深度底层原理分析与知识体系构建
java·jvm·算法
Liu_Meihao1 小时前
【算法】798. 差分矩阵
线性代数·算法·矩阵
老朋友此林2 小时前
浅析 Redis 分片集群 Cluster 原理、手动搭建、动态伸缩集群、故障转移
java·数据库·redis
楼台的春风2 小时前
【图像的读写与基本操作】
图像处理·人工智能·深度学习·opencv·算法·计算机视觉·嵌入式
FeiCat Henry2 小时前
KGG转MP3工具|非KGM文件|解密音频
科技·算法·音视频·软件工程·视频编解码
小喵要摸鱼3 小时前
【Python LeetCode】面试经典 150 题
python·leetcode·面试
tianmu_sama3 小时前
[Linux高性能服务器编程] 多线程编程
linux·服务器·c++·算法
JKHaaa4 小时前
单链表的排序(C++)
数据结构·c++·算法
nqqcat~4 小时前
C语言机试编程题
c语言·开发语言·考研·算法