[剑指-Offer] 9. 用两个栈实现队列(栈、队列、模拟)

1. 题目来源

链接:用两个栈实现队列
来源:LeetCode——《剑指-Offer》专项

2. 题目说明

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

示例 :

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

示例 2:

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

提示:

  • 1 <= values <= 10000
  • 最多会对 appendTaildeleteHead 进行 10000 次调用

3. 题目解析

3.1 方法一:双栈模拟法

双栈模拟队列,经典例题,在此简单写思路:

  • 创建两个栈 s1s2,其中 s1 用来接受数据, s2 输出数据
  • appendTail() 数据直接 s1.push() 即可
  • deleteHead() 如果s1s2均为空,说明队列中没有数据,返回 -1 即可
  • deleteHead() 如果 s2 为空,需要将 s1 中的数据全部倒进 s2,达到逆转序列的效果,从栈顶到栈底满足队列元素排序
  • deleteHead() 如果 s2 不为空,直接 s2top 取出即可,因为逆转过来的数据还没全部出队
// 执行用时 :564 ms, 在所有 C++ 提交中击败了23.52%的用户
// 内存消耗 :106.1 MB, 在所有 C++ 提交中击败了100.00%的用户

class CQueue {
public:
    CQueue() {

    }
    
    void appendTail(int value) {
        s1.push(value);
    }
    
    int deleteHead() {
        int tmp = 0;
        if (s2.empty() && s1.empty())
            return -1;
        if (s2.empty()) {
            while (!s1.empty()) {
                s2.push(s1.top());
                s1.pop();
            }
        }
        tmp = s2.top();
        s2.pop();
        return tmp;
    }
private:
    stack<int> s1;
    stack<int> s2;
};

/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue* obj = new CQueue();
 * obj->appendTail(value);
 * int param_2 = obj->deleteHead();
 */
发布了307 篇原创文章 · 获赞 125 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/yl_puyu/article/details/104433916
今日推荐