栈是一种后进先出的线性表,而队列是先进先出的线性表,通过一个栈可以实现一次反序,所以通过两个栈可以实现顺序存取。思路如下:假设两个栈分别为s1,s2。对s1进行入队,出队时,先推断s2是否为空,如果s2不为空,则直接弹出s2最上面的元素。如果s2为空,则将s1的所有元素出栈放入s2中。实现代码如下:
package test.stack;
//用两个栈模拟队列:栈可以起到反序的作用,两个栈便可以实现队列的先进先出功能
public class Stack2Queue {
private MyStackByArray s1; //入队用的栈
private MyStackByArray s2; //出队用的栈
public Stack2Queue() {
this(3); //默认容量为3
}
public Stack2Queue(int capacity) {
s1=new MyStackByArray(capacity);
s2=new MyStackByArray(capacity);
}
//入队
public void add(int value) {
s1.push(value);
}
//出队
public int remove() {
//如果第二个栈不为空,就直接出栈
if(!s2.isEmpty()) {
return s2.pop();
}
//否则第二个栈为空,则把第一个栈的元素装入第二个栈,实现顺序,s2栈顶就是最先加入的
while(!s1.isEmpty()) {
s2.push(s1.pop());
}
//再弹出栈顶元素
return s2.pop();
}
//测试
public static void main(String[] args) {
Stack2Queue queue=new Stack2Queue(5);
queue.add(1);
queue.add(2);
queue.add(3);
System.out.println("出队:"+queue.remove());
System.out.println("出队:"+queue.remove());
System.out.println("出队:"+queue.remove());
}
}