[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();
 */
相关推荐
YOU OU2 小时前
Redis基础常识与命令
数据库·redis·缓存
To_OC3 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
2401_841495643 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
吳所畏惧7 小时前
宝塔面板Redis密码修改指南:SSH命令修改 vs 面板UI界面修改,哪个更靠谱?
运维·服务器·数据库·redis·缓存·ssh
爱刷碗的苏泓舒7 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
赵丙双8 小时前
Redis 概率相关的数据类型
redis
烬羽10 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
闪电悠米10 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
星空露珠11 小时前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua