用两个栈实现队列

来源:互联网 发布:什么是云计算 通俗 编辑:程序博客网 时间:2024/06/05 01:18

用两个栈实现队列

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
原创粉丝点击