版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/u010647035/article/details/88776574
问题描述
使用两个栈模拟队列,比如输入:1 2 3 4,则要求输出仍是:1 2 3 4
解题思路
1、有两个栈,一个用来存放入队数据(数据栈),一个用来辅助(辅助栈)实现数据出队。
2、数据添加时,会依次压人栈,取数据时会取栈顶元素,但要模拟队列的先进先出,所以就得取栈底元素,那么辅助栈就派上用场了,把数据栈的元素依次弹出到辅助栈,保留最后一个元素,数据栈就直接把元素弹出,这时数据栈就已经空了。
3、辅助栈的元素依次压人数据栈,这样我们就成功取到了栈底元素。
代码实现
public class Stack2Queue {
/**
* 用栈的入栈和出栈
* 来实现队列的入队和出队
* stack1是入栈的,stack2是出栈的。
* 入队列:直接压入stack1即可
* 出队列:如果stack2不为空,把stack2中的栈顶元素直接弹出;
* 否则,把stack1的所有元素全部弹出压入stack2中,再弹出stack2的栈顶元素
*/
Stack stack1 = new Stack();
Stack stack2 = new Stack();
public void add(Object o) {
stack1.push(o);
}
public Object poll() {
Object o = null;
if (stack2.size()== 0) {
//把stack1的数据放入stack2,留下最后一个数据
while (stack1.size() > 1) {
stack2.push(stack1.pop());
}
if (stack1.size() == 1) {
//把stack1的留下的那个数据返回出去
o = stack1.pop();
}
} else {
o = stack2.pop();
}
return o;
}
public int length() {
return stack1.size() + stack2.size();
}
public static void main(String[] args) {
/**
* 用两个栈实现队列
* */
Stack2Queue stack2Queue = new Stack2Queue();
stack2Queue.add("a");
stack2Queue.add("b");
stack2Queue.add("c");
stack2Queue.add("d");
stack2Queue.add("e");
while(stack2Queue.length()>0) {
System.out.println(stack2Queue.poll());
}
}
}