要求:
编写一个类,用两个栈实现队列,支持队列的基本操作(add、poll、peek)。
思考:
队列的特点是先进后出,而栈的特点是先进后出。可以用两个栈正好把这个顺序反过来。
方法:
具体是一个栈实现压入栈,在压入数据时只往这个栈里压入,记为stackPush;另一个栈只作为弹出栈,在弹出数据时只从这个栈弹出,记为stackPop。
注意:
1.如果stackPush要网stackPop中压入数据,必须一次性把stackPush中的数据全部压入。
2.如果stackPop不为空,stackPush绝对不能向stackPop压入数据。
实验代码:
package algorithm_2;
import java.util.*;
public class TwoStackQueue {
public Stack<Integer> stackPush;
public Stack<Integer> stackPop;
public TwoStackQueue(){
stackPush = new Stack<Integer>();
stackPop = new Stack<Integer>();
}
public void add(int pushInt)
{
stackPush.push(pushInt);
}
public void poll()
{
if (stackPop.empty() && stackPush.empty()){
throw new RuntimeException("Queue is empty.");
}
else if (stackPop.empty()){
while(!stackPush.empty()){
// System.out.println(stackPush.peek());
stackPop.push(stackPush.pop());
}
}
}
}
测试主函数:
package algorithm_2;
import algorithm_2.TwoStackQueue;
public class algorithm_2 {
public static void main(String[] args){
TwoStackQueue mytest ;
mytest = new TwoStackQueue();
int s[]={1,2,3,4,5};
for(int i = 0; i<s.length;i++){
mytest.add(s[i]);
System.out.printf("Push %d in stackPush\n",s[i]);
}
mytest.poll();
while(!mytest.stackPop.isEmpty()){
System.out.printf("Poll %d in stackPop\n", mytest.stackPop.pop());
}
}
}
测试结果: