用两个栈stack1和stack2模拟一个队列时,stack1作输入栈,逐个元素压栈,以此模拟队列元素的入队。当需要出队时,将栈stack1退栈并逐个压入栈stack2中,stack1中最先入栈的元素,在stack2中处于栈顶。stack2退栈,相当于队列的出队,实现了先进先出。显然,只有栈stack2为空且stack1也为空,才算是队列空。
入栈时,若stack1未满则直接入栈,否则若stack2为空,则先将stack1的元素转移到stack2中再入栈;出栈时,若stack2不为空则直接出栈,否则若stack1不为空则将stack1中的元素倒入stack2再出栈。
这里用java的Stack类来实现,由于Stack使用Vector实现的,可动态增长,则入栈时无需考虑栈是否已满。
/**
* @author wjh
*
*/
public class StackToQueue {
private static Stack stack1 = new Stack();
private static Stack stack2 = new Stack();
//入队
private void enqueue(Stack stack1, int x){
stack1.push(x);
System.out.println("入队元素:"+x);
}
//出队
private void dequeue(Stack stack2){
int t;
if(!stack2.empty()){ //stack2不为空直接出队
t = stack2.pop();
System.out.println("出队元素:"+t);
}
else if(stack2.empty()&&!stack1.empty()){//stack2为空但stack1不为空时,
while(!stack1.empty()){ //stack1的元素全部出栈进入stack2,
t = stack1.pop();
stack2.push(t);
}
t = stack2.pop(); //stack2出队
System.out.println("出队元素:"+t);
}
else
System.out.println("队列已经为空,请先入队!");
}
//判断队列是否为空
private boolean isEmpty(){
if(stack1.isEmpty()&&stack2.isEmpty()){
return true;
}
return false;
}
public static void main(String[] args) {
StackToQueue queue = new StackToQueue();
int flag,x;
Scanner scan = new Scanner(System.in);
System.out.println("请输入数字:0-入队;1-出队;2-判断队列是否为空;3-退出");
flag = scan.nextInt();
while(flag!=3){
switch(flag){
case 0:
System.out.println("请输入入栈的数字:");
x = scan.nextInt();
queue.enqueue(stack1, x);
break;
case 1:
queue.dequeue(stack2);
break;
case 2:
if(queue.isEmpty()){
System.out.println("队列为空!");
}
else
System.out.println("队列不为空!");
break;
case 3:
System.exit(0);
break;
default:
System.out.println("输入数字的数字有误!");
break;
}
System.out.println("请输入数字:0-入队;1-出队;2-判断队列是否为空;3-退出");
flag = scan.nextInt();
}
}
}
本文介绍如何使用两个Java Stack实例模拟队列的First In First Out(FIFO)行为。通过将栈1作为输入栈进行入队操作,而栈2用于出队。在需要出队时,将栈1的元素转移到栈2,然后从栈2顶部出队,确保先进先出。详细代码展示了如何实现这一过程。
681

被折叠的 条评论
为什么被折叠?



