用两个栈实现队列

用两个栈实现队列

1. 题目描述

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

考察内容:队列,栈

2. 解题思路

  1. 栈是一种后进先出的数据结构
  2. 队列是一种先进先出的数据结构
  3. 当一个元素位于队列的front栈的top时,会被率先退出数据结构
  4. 一个元素会率先被存储在栈的top队列的rear
  5. 因此,当两个栈中存储以相反的次序存储相同的元素时,就实现了队列

3. 代码实现

import java.util.Stack;

public class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();

   public void push(int node) {
        stack1.push(node);
        stack2.clear();
        Stack<Integer> stack = (Stack<Integer>) stack1.clone(); 
        while(!stack.empty()){
            stack2.push(stack.pop());
        }
    }

    public int pop() {
        int pop = stack2.pop();
        stack1.clear();
        Stack<Integer> stack = (Stack<Integer>) stack2.clone(); 
        while(!stack.empty()){
            stack1.push(stack.pop());
        }
        return pop;
    }
}

4. 总结分析

  1. 使用了一个Stack作为临时存储的媒介,因为我发现使用iterator和toArray方法对Stack进行遍历始终不能得到正确的结果
  2. 使用iterator时,Stack的遍历是从栈的底部开始的,因此使用iterator.next()进行遍历时,使得两个栈中的数据相同,而本题目希望的正确的结果是两个栈中存储的内容是相反的。
  3. 使用Stack.toArray()方法会返回一个Object[]类型的数组,通过强制转换成一个Integar[]的数组,本身做法就是错误的,运行时会抛出java.lang.ClassCastException异常。

5. 改进方案

通过参考网友的一些做法,发现了一种更好的解题思路:
有两个栈,栈1和栈2.当入栈的时候,我们将它全放进栈1中,当需要出栈的时候,我们将栈1出栈到栈2中,然后再将栈2依次出栈。

 具体的代码如下:

链接:https://www.nowcoder.com/questionTerminal/54275ddae22f475981afa2244dd448c6  
来源:牛客网 

import java.util.Stack;

public class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();

    public void push(int node) {
        stack1.push(new Integer(node));
    }

    public int pop() {
        if(stack2.isEmpty()){
            while(!stack1.isEmpty()){
                stack2.push(stack1.pop());
            }
        }
        return stack2.pop().intValue();
    }
}

此做法不仅节省了空间,也使得和删除操作更加简单。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值