栈:先进后出
队列:先进先出
那么如何使用队列数据结构实现栈呢
首先准备两个队列,我们将他们分别称之为help队列与data队列
示意图如下:
例如要将1 2 3依次进行push
此时我们知道要是直接pop() data队列的数据那么结果一定是根据队列的特点pop出最先进入的数字1。
但我们要实现栈,肯定是期望我们自己实现的这个pop() 操作可以弹出最晚进入的数字3。
此时我们可以将除data队列中最后一个数字以外的其他数字都从data中弹出,并将其放入help队列中。
此时data队列中剩余的元素就是我们的“栈顶”元素。将其弹出就实现了我们想要的pop操作。
我们弹出数据后要注意将help与data的引用进行交换。也就是将以前的help队列变为data,而data队列变成help。
如果此时又push了新的元素5(注意push操作只用push进data队列即可)。
此时要进行pop操作,那还是如上先让除了最后一个元素5以外的其他元素进help队列
此时data队列里这最后一个数据就是我们想要的“栈顶”元素。
将其弹出,并将两个队列的引用进行交换,便完成了pop操作。具体java代码如下:
```java
public static class QueueTostack
{
private Queue<Integer> help;
private Queue<Integer> data;
public QueueTostack()
{
help=new LinkedList<Integer>();
data=new LinkedList<Integer>();
}
//push操作 所有数据都push入data队列中
public void push(int num)
{
data.add(num);
}
//pop操作
public int pop()
{
//判空
if(data.isEmpty())
{
throw new ArrayIndexOutOfBoundsException("Stack is empty");
}
//将data队列除最后一个元素外的其他元素都放入help队列
while(data.size()>1)
{
help.add(data.poll());
}
//data的最后一个元素弹出
int res=data.poll();
//交换两个队列的引用
swap(data,help);
return res;
}
//查看栈顶元素
public int peek()
{
if(data.isEmpty())
{
throw new ArrayIndexOutOfBoundsException("Stack is empty");
}
while(data.size()>1)
{
help.add(data.poll());
}
int res=data.peek();
help.add(data.poll());
swap(data,help);
return res;
}
//交换两个队列的引用
private void swap(Queue<Integer> data2, Queue<Integer> help2) {
// TODO Auto-generated method stub
Queue<Integer> temp=help2;
help2=data2;
data2=temp;
}
}