剑指 Offer 09. 用两个栈实现队列

题目链接

剑指 Offer 09. 用两个栈实现队列 mid

题目描述

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTaildeleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 − 1 -1 1 )

示例 1:

输入:
[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”,“deleteHead”]
[[],[3],[],[],[]]
输出:[null,null,3,-1,-1]

示例 2:

输入:
[“CQueue”,“deleteHead”,“appendTail”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]

提示:

  • 1 ≤ v a l u e s ≤ 10000 1 \leq values \leq 10000 1values10000
  • 最多会对 appendTaildeleteHead 进行 10000 10000 10000 次调用

解法:栈 + 模拟

由于 队列先进先出 的,而 先进后出 的。

将要入队的元素,先压入第一个栈 s 1 s1 s1,在将 s 1 s1 s1 中的元素弹出来,压入到第二个栈 s 2 s2 s2,此时 s 2 s2 s2 栈顶的元素就是队头元素。要删除队头元素的时候,直接弹出 s 2 s2 s2 栈顶元素即可。

我们只有在删除队列元素的时候,才会将 s 1 s1 s1 中元素弹出,压入到 s 2 s2 s2 中:

  • 如果 s 2 s2 s2 不为空,那么此时 s 2 s2 s2 栈顶元素就是队头元素,直接弹出返回即可;
  • 如果 s 1 s1 s1 为空,那么说明此时 s 1 s1 s1 s 2 s2 s2 都为空,也就是 “队列” 为空,直接返回 − 1 -1 1 即可;
  • 否则就将 s 1 s1 s1 的元素,弹出,压入到 s 2 s2 s2 中,返回 s 2 s2 s2 的栈顶元素,也就是 “队头” 元素。

时间复杂度: O ( n ) O(n) O(n)

C++代码:

class CQueue {
public:
    stack<int> s1 , s2;
    CQueue() {

    }
    
    void appendTail(int value) {
        s1.push(value);
    }
    
    int deleteHead() {
        int ans;
        if(!s2.empty()){
            ans = s2.top();
            s2.pop();
            return ans;
        }
        if(s1.empty()) return -1;

        while(!s1.empty()){
            s2.push(s1.top());
            s1.pop();
        }

        ans = s2.top();
        s2.pop();

        return ans;
    }
};

你可能感兴趣的:(Leetcode,剑指offer,栈,队列)