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

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

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

我的解法也是最笨的解法:
考虑要使用两个栈实现一个队列,栈的特点是先进后出,队列的特点是先进先出,添加队尾比较简单,直接添加到栈中就行了,最麻烦的就是怎么获取队首元素,因为往栈中添加元素的时候,前面的元素在栈底,获取队首元素时要将上面的元素全部弹出就才行。
我的解法是,应该也是很多人的解法。

  1. 设置两个栈input,output,input用来添加队尾元素,直接加进去就行。
  2. output用来获取队首元素,先将input栈中的元素逐个弹出再压入output中,这样就实现了input的元素逆序,使得output的栈顶元素变为input的栈底元素,也就是获得了队列的元素顺序。
  3. 然后再将output中的元素再逐个弹出压入到input中,这样input从栈底到栈顶的元素顺序就是删除了队首元素后的元素顺序。(其实根本没必要再这样做,阿巴阿巴阿巴)。
#include<stack>
#include<iostream>
using namespace std;

class CQueue {
private:
    stack<int> input;
    stack<int> output;

public:
    CQueue() {
    
    }
    
    void appendTail(int value) {
        input.push(value);
    }
    
    int deleteHead() {
        if(input.empty()){
            return -1;
        }
        else{
            int top;
            while (!input.empty())
            {
                output.push(input.top());
                input.pop();
            }
            top = output.top();
            output.pop();
            while (!output.empty())
            {
                input.push(output.top());
                output.pop();
            }
            return top;
        }
    }
};

/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue* obj = new CQueue();
 * obj->appendTail(value);
 * int param_2 = obj->deleteHead();
 */

int main(){
    CQueue *obj = new CQueue();
    cout << obj->deleteHead();
    obj->appendTail(5);
    obj->appendTail(2);
    cout << obj->deleteHead();
    cout << obj->deleteHead();
    return 0;
}

运行时间:
在这里插入图片描述
做完之后想想这肯定不太行,就想了半天还是看了官方解答。
其实这非常简答,就是上面第3步完全没必要,第一次删除操作时,将input栈中的元素添加到output中就实现了队尾队首分离,只要output中还有元素就可以直接获取output的栈顶元素也就是队列的队首元素,只有output为空时,再将input中元素再次按照上面第二步添加到output中又获得了新的队首元素。只有当output和input都为空时再返回-1就行了。

#include<stack>
#include<iostream>
using namespace std;

class CQueue {
private:
    stack<int> input;
    stack<int> output;

public:
    CQueue() {
    
    }
    
    void appendTail(int value) {
        input.push(value);
    }
    
    int deleteHead() {
        if(!output.empty()){         //如果output非空就直接弹出栈顶元素就行了
            int top = output.top();
            output.pop();
            return top;
        }
        if (input.empty()) {  
            return -1;               //如果到了这一步input是空的说明output也是空,也就是队列为空
        }
        while (!input.empty())       //从上面的操作到这,说明output为空,input非空,将input中的元素添加到input中
        {
            output.push(input.top());
            input.pop();
        }
        int top = output.top();       //然后输出队首元素
        output.pop();
        return top;
    }
};

/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue* obj = new CQueue();
 * obj->appendTail(value);
 * int param_2 = obj->deleteHead();
 */

int main(){
    CQueue *obj = new CQueue();
    cout << obj->deleteHead();
    obj->appendTail(5);
    obj->appendTail(2);
    cout << obj->deleteHead();
    cout << obj->deleteHead();
    return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w还是晒太阳吧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值