剑指 Offer 09. 用两个栈实现队列(C++,辅助栈)

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

原题

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

题目大意及思路

  • 思路: 题中要求使用栈来实现队列,做到可以直接删除并输出最先进去的元素,在队尾增加元素。我们可以想到从一个栈pop到另一个栈可以使得最先输入的元素位于栈的首部,所以什么时候将一个栈的元素pop到另一个栈是关键。一般来说解题应该重点考虑临界条件,此时的临界条件是栈空。而两个栈均空时,输入deleteHead则应输出-1,输入appendtail时应该将元素放至其中一个栈中;那么我们可以想到,输入元素时我们应固定在一个栈中,若一直在输入,另一个栈应为空,当需要输出最先的元素时,我们应将第一个栈的元素全倒过去放至第二个栈,进行输出。因此我们将两个栈分别作为输入栈和输出栈,所有的输入直接放入输入栈中,当需要输出时查看输出栈是否为空,若为空,将输入栈元素全部倒入输出栈,若非空,直接输出输出栈栈顶元素。

代码

class CQueue {
public:
    stack<int> in_stack, out_stack;
    CQueue() {

    }
    void appendTail(int value) { 
        in_stack.push(value);
        return;
    }
    int deleteHead() {
        if(out_stack.empty()){
            if(in_stack.empty()) return -1;
            else{
                while(!in_stack.empty()){
                    out_stack.push(in_stack.top());
                    in_stack.pop();
                } 
            }
        }
        int out_element=out_stack.top();
        out_stack.pop();
        return out_element;
    }
};

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

运行截图

在这里插入图片描述

收获

最后根据官方解答,将两个栈调整了一下:
从public到private。
因为类对象里的public都能外界调用使用,但这两个栈应该保持其私有性,防止恶意破坏。

public:
    stack<int> in_stack, out_stack;

变至:

private:
    stack<int> in_stack, out_stack;
public:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值