队列是先进先出,而栈是先进后出,所以用队列实现栈比较麻烦,实现过程是基于循环队列,先实例化两个空队列q1,q2,
然后向其中一个插入数据:
之后,又把队列q1中的数据倒入到队列q2中,不能全部倒完,倒到只剩下一个元素为止,然后让这个元素出队,就完成了模拟栈的先进后出这个过程了,因为我们要可能会不止一次的模拟出栈,所以要定义两个指针p1,p2,且是其中一个指针p1一直指向将要出队到只剩一个元素的那个队列,而另一个指针p2则始终指向接收元素的那个队列,这样的话随着指针p1,p2不停地灵活倒换,就实现了用两个队列实现一个栈的问题:
/**
* 模拟入栈
* @param q1
* @param q2
* @param val
*/
public static void enterStack(LoopQueue q1,LoopQueue q2,int val) {
LoopQueue queue = null;
if(!q1.isEmpty()) {
queue = q1;
}else {
queue = q2;
}
queue.push(val);
}
/**
* 模拟出栈
* @param q1
* @param q2
* @return
*/
public static int popStack(LoopQueue q1,LoopQueue q2) {
LoopQueue p1 = null;//永远指向出队的队列
LoopQueue p2 = null;//永远指向出队后元素需要放置这些元素的队列
//确认好出队的队列和放置元素的队列
if (!q1.isEmpty()) {
p1 = q1;
p2 = q2;
} else {
p1 = q2;
p2 = q1;
}
//开始出队
int num = -1;
if (p1.isEmpty()) {
return -1;
} else {
//出元素,出到只剩下一个
while (p1.usedSize > 1) {
num = p1.getTop();
p1.pop();//把p1指向的队列出队到只剩下一个
p2.push(num);//把元素放到p2指向的队列
}
int temp = p1.getTop();
p1.pop();
return temp;
}
}