7.用两个栈实现队列

来源:互联网 发布:js声明一个json对象 编辑:程序博客网 时间:2024/05/17 03:43

栈和队列是两个相反的存储和相反的弹出顺序。

既然使用栈实现队列。就是将栈 1 的数据出栈并存储到另外一个栈2里面,那么两个栈的序列就是相反的。在栈2里面pop出来的数据就和正常的队列出队一样。

实现思想:
用栈 1 存储数据 ,栈2 用来临时存储数据,并实现出栈。

 public void push(int node) {        stack1.push(node);    }    public int pop() {        while (!stack1.isEmpty()) {            stack2.push(stack1.pop());        }        int result = stack2.pop();        while (!stack2.isEmpty()) {            stack1.push(stack2.pop());        }        return result;    }

当然还有更加方便的一个方法:
实现思想:
用栈1 栈2 都只存储一份数据。对于队列的push, 需要入栈的时候将数据压入栈 1 。对于队列的pop,当栈2为空时,需要将栈1的数据出栈并压入栈2 ,这样栈2 的出栈顺序就和正常的出队顺序一样,也就是说栈2 里的所有数据,都和压栈的顺序相同(先入先出),当stack2的数据都出栈完了,再从stack1里面出栈,然后压栈到stack2。如果一直出栈,直到stack1 和stack2都没有
数据了,那么就没有数据可以出栈了。
出栈的两种情况:

    stack2为空               stack2不为空stack1 stack2  stack2    stack1    stack2   ->   stack2 5       null     1           5         1          2 4                2           4         2          3 3                3                     3           2                4                                 1                5 栈底             栈底

代码如下

import java.util.Stack;import java.util.EmptyStackException;public class Solution {    Stack<Integer> stack1 = new Stack<Integer>();    Stack<Integer> stack2 = new Stack<Integer>();    public void push(int node) {        stack1.push(node);    } public int pop() {        if(stack1.empty()&&stack2.empty()){//如果两个栈都没有数据就        }        if(stack2.empty()){            while(!stack1.empty()){//stack2没有数据,则需要从stack1出栈数据到stack1.                stack2.push(stack1.pop());            }        }        return stack2.pop();//无论如何都是从stack2 里面的到队列出队的值    }}
原创粉丝点击