要用栈模拟队列,首先要清楚栈和队列有什么不同的特点
相同点:栈和队列都是保存一组元素的容器
队列(Queue):线性表结构,遵循先进先出,后进出的(FIFO:First in last out)的基本原则;它只允许在队首进行出队(删除)的操作,在队尾进行入队(插入)的操作;
栈(Stack): 栈采用的是后进先出(LIFO:Last in fist out)的基本原则,与队列的操作相反,栈只允许在栈顶进行插入和删出操作;
对栈和队列之间的特点有了大概了解,就能开始我们的的正式实现了首先在编写前要明确要实现队列的三种基本方法:
1.入队:offer() 2.出对:poll() 3. 遍历
首先由于栈的特点和队列截然相反。所以我可以定义两个不同的栈:分别是in 和 out,一个入队栈一个出队栈;当我们添加元素时,元素会先进入到入队栈里,当我们出队时,我们将入队栈的元素转移到出队栈,在将栈顶的元素出队,到继续添加元素时.再将出队栈的元素转移到入队栈,然后在栈顶进行操作.
比如我们要将"A"和"B"入队,首先会进入入队栈中
但由于栈后进后出的特点,所以直接出队栈中元素的顺序则变为了“B” “A”,所以我们要将入队栈的元素转到出队栈中,这时出对栈中元素的顺序就变成了"A" "B",此时出对就与入队时的顺序一致了
遍历,我们可以直接使用出队的方法,当出对栈和入队栈为空的时候则停止出队.
具体代码如下:
import java.util.Stack;
public class Damo05 {
public static void main(String[] args) {
myqueue<String> queue = new myqueue<String>();
queue.offer("A");
queue.offer("B");
queue.offer("C");
while (!queue.isEmpty()) {
System.out.println(queue.poll());
}
}
}
//栈实现队列
class myqueue<E>{
private Stack<E> in = new Stack<E>();//入队栈
private Stack<E> out = new Stack<E>();//出队栈
//入队
public void offer(E e) {
while (!out.isEmpty()) {
in.push(out.pop());
}
in.push(e);
}
//出队
public E poll() {
while (!in.isEmpty()) {
out.push(in.pop());
}
return out.pop();
}
public boolean isEmpty () {
return in.size()==0 && out.size()==0;
}
}
结果为:
A
B
C