剑指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();
    }
}
发布了31 篇原创文章 · 获赞 10 · 访问量 3419
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览