剑指Offer-03——用两个栈实现队列

问题描述:
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

  在完成本题之前,首先需要明确栈和队列的机制。

  • 栈:LIFO(last in first out)先入后出
  • 队列:FIFO(first in first out)先入先出

解题思路描述:
一个先进先出,一个先进后出。顺序刚好相反。(这里以栈1,栈2,队列来描述三者的关系。)

  • 1,因此当push时,可以将栈1作为push的保存结构,来临时保存push的数据。
  • 2,当pop时,这里可以将栈1的数据全部倒入栈2里面,刚好可以把顺序反转过来,达到先入先出的效果。
  • 3,当然这里也会出现问题,比如,你先push了1,2,3进入栈1中,栈1此刻数据顺序为栈1(3,2,1);当pop时,先将栈1的数据全部转到了栈2,此刻为栈1(null),栈2(1,2,3),pop出去2个变为栈2(3)。如果这时再push一个4,先push到栈1中,栈1变为(4);再pop,此刻栈1(4)将数据pop到栈2中变为栈1(null),而栈2变为(4,3),pop出去的将会是4,不符合要求,因此需要在前面加上判断,判断栈2是否为空,如果不为空,pop的应该是栈2中的元素,如果为空才将栈1的转移到栈2再pop。
    代码:
class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();

    public void push(int node) {
        //先将push到队列的元素加入栈1中
        stack1.push(node);
    }

    public int pop() {
        if(!stack2.empty()){
            //检查栈2中是否还有元素,如果有就直接从栈2中取出
            return stack2.pop();
        }else {
            //如果栈2为空,就从栈1将数据倒入栈2,达到顺序的效果
            while(!stack1.empty()){
                stack2.push(stack1.pop());
            }
        }
        return stack2.pop();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值