您的位置:首页 > 博客中心 > 互联网 >

leetcode 剑指offer 9 用两个栈实现队列

时间:2022-05-11 07:38

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

解题思路:

  • 栈无法实现队列功能: 栈底元素(对应队首元素)无法直接删除,需要将上方所有元素出栈。
  • 双栈可实现列表倒序: 设有含三个元素的栈 A = [1,2,3] 和空栈 B = []。若循环执行 A 元素出栈并添加入栈 B ,直到栈 A 为空,则 A=[] , B = [3,2,1] ,即 栈 B 元素实现栈 A 元素倒序 。
  • 利用栈 B删除队首元素: 倒序后B ,执行出栈则相当于删除了A的栈底元素,即对应队首元素。

技术图片

解法:

class CQueue {
public:
    CQueue() {
    }
    void appendTail(int value) {
        s1.push(value);
    }
    int deleteHead() {
        if(s1.empty()) return -1;
        while (!s1.empty()){
            int tmp = s1.top();
            s1.pop();
            s2.push(tmp);
        }
        int res = s2.top();
        s2.pop();
        while (!s2.empty()){
            int tmp = s2.top();
            s2.pop();
            s1.push(tmp);
        }
        return res;
    }
    stacks1;
    stacks2;
};
/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue* obj = new CQueue();
 * obj->appendTail(value);
 * int param_2 = obj->deleteHead();
 */

本类排行

今日推荐

热门手游