[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();
 */
相关推荐
TiAmo zhang12 分钟前
深度学习与图像处理 | 基于PaddlePaddle的梯度下降算法实现(线性回归投资预测)
图像处理·深度学习·算法
一匹电信狗26 分钟前
【C++】手搓一个STL风格的vector容器
c语言·数据结构·c++·算法·leetcode·stl·visual studio
生信探索31 分钟前
SeuratExtend 可视化教程(1):单细胞分析的高颜值绘图指南
算法
李永奉1 小时前
C语言-数组:数组(定义、初始化、元素的访问、遍历)内存和内存地址、数组的查找算法和排序算法;
c语言·算法·排序算法
星辰大海的精灵1 小时前
深入解析 CopyOnWriteArrayList
java·后端·算法
逝雪Yuki1 小时前
Leetcode——11. 盛最多水的容器
c++·算法·leetcode·双指针
找不到、了1 小时前
Java排序算法之<希尔排序>
java·算法·排序算法
啊阿狸不会拉杆2 小时前
《Java 程序设计》第 8 章 - Java 常用核心类详解
java·开发语言·python·算法·intellij-idea
m0_626535202 小时前
python每日一题
算法
SuperCandyXu2 小时前
洛谷 P10448 组合型枚举-普及-
算法·洛谷