两个栈实现队列

问题:已知下面Stack类以及其三个方法push、pop和count,请用两个栈实现队列类的入队和出队的方法


这道题在面试中出现主要考察三点:

1、在短时间内,能不能找到这道题足够清晰的思路(思维的敏捷和清晰)
2、能不能在单向表述中,清楚的描述自己的思路和想法(表达能力)
3、对于一些具体的细节能否考虑到


大多数人的思路为:

入队时:将元素压入s1
出队时:将s1的元素逐个弹出并压入s2中,将s2的顶元素作为出队元素,之后再将s2剩下的元素逐个倒回s1中
这里写图片描述

优化:在出队的时候,不用全部倒入到s2中,因为可以将最后一个元素直接弹出,可以减少一次压栈的操作


变种思路:

入队时:先判断s1是否为空,如果不为空,说明元素都在s1中,此时将入队元素直接压入s1中;如果为空,要将s2中的元素倒回s1中再压入入队元素
出队时:先判断s2是否为空,如果不为空,直接将s2的顶元素出队;如果为空,将s1的元素逐个倒入s2中,并把最后一个元素直接弹出并出队。


最终变种思路:

入队时:将元素压入s1
出队时:判断s2是否为空,如不为空,则直接弹出顶元素;如果为空,则将s1的元素逐个倒入到s2中,并把最后一个元素弹出并出队


以上几个思路还需要考虑到一种情况,就是没有元素可供出队时的处理(两个栈都为空的时候,出队一定会引起异常)

代码如下:

class Solution
{
public:
    void push(int node) {
        stack1.push(node);
    }
    int pop() {
        int a;
        if(stack2.empty()){
            while(!stack1.empty){
                a=stack1.top();
                stack2.push(a);
                stack1.pop();
            }
        }
        a = stack2.top();
        stack2.pop();
        return a;
    }
private:
    stack<int> stack1;
    stack<int> stack2;
};

拓展:用两个队实现一个栈的功能
思路:
入栈:将元素进队列A
出栈:判断队列A中元素的个数是否为一,如果等于一,则出队列,否则将队列A中的元素依次出队列并放入队列B中
直到队列A中的元素留下一个,然后队列A出队列,再把队列B中元素出队列依次放入队列A中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值