[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();
 */
相关推荐
小安同学iter2 小时前
SQL50+Hot100系列(11.9)
算法·leetcode·职场和发展
炼金士3 小时前
基于多智能体技术的码头车辆最快行驶路径方案重构
算法·路径规划·集装箱码头
小刘max4 小时前
最长递增子序列(LIS)详解:从 dp[i] 到 O(n²) 动态规划
算法·动态规划
资深web全栈开发5 小时前
如何正确使用缓存:常见陷阱与最佳实践
redis·缓存·golang
谢景行^顾5 小时前
数据结构知识掌握
linux·数据结构·算法
ShineWinsu5 小时前
对于数据结构:堆的超详细保姆级解析——下(堆排序以及TOP-K问题)
c语言·数据结构·c++·算法·面试·二叉树·
DuHz6 小时前
基于时频域霍夫变换的汽车雷达互干扰抑制——论文阅读
论文阅读·算法·汽车·毫米波雷达
hetao17338376 小时前
ZYZ28-NOIP模拟赛-Round4 hetao1733837的record
c++·算法
Nebula_g6 小时前
C语言应用实例:解方程(二分查找)
c语言·开发语言·学习·算法·二分查找·基础
Craaaayon6 小时前
如何选择两种缓存更新策略(写缓存+异步写库;写数据库+异步更新缓存)
java·数据库·redis·后端·缓存·mybatis