上一篇和大家讨论了如何使用队列实现栈
队列实现栈
栈:先进后出
队列:先进先出
那么如何使用栈数据结构实现队列呢
我们定义两个栈分别命名为push栈和pop栈
示意图如下:
将数字1 2 3 依次加入,
如果直接弹出push栈内容则是数字3,与我们预想的队列先进先出弹出数字1不符。
我们push操作时直接加入push栈即可,pop时需要从pop栈中取元素。若pop栈为空则将push栈中的所有元素都加入pop栈中,再弹出pop的栈顶;若此时push栈也为空则pop操作失败。
数字加入pop栈后将pop栈顶弹出即可用栈实现队列的pop操作。
若是此时123均被弹出 pop栈空而push栈中新进入了数字4、5:
此时若要弹栈而pop为空,所以要将push栈的内容全部加入pop栈中,将pop栈顶弹出即可。
具体实现代码如下:
public static class StackToqueue
{
private Stack<Integer> pushstack;
private Stack<Integer> popstack;
public StackToqueue() {
pushstack=new Stack<Integer>();
popstack=new Stack<Integer>();
}
public void push(int num)
{
pushstack.add(num);
}
public int pop()
{
if(popstack.isEmpty())
{
//pop与push栈均空,则说明无法pop
if(pushstack.isEmpty())
{
throw new ArrayIndexOutOfBoundsException("队列空");
}
//pop为空而push不空时,将push的所有内容加入pop中
else
{
while(!pushstack.isEmpty())
{
popstack.add(pushstack.pop());
}
}
}
return popstack.pop();
}
public int peek()
{
if(popstack.isEmpty())
{
if(pushstack.isEmpty())
{
throw new ArrayIndexOutOfBoundsException("队列空");
}
else
{
while(!pushstack.isEmpty())
{
popstack.add(pushstack.pop());
}
}
}
return popstack.peek();
}
}