思想引导:队列是一个先进先出的结构,而栈是先进后出的结构 如果想要用队列实现栈,即让队列每次出数据时候,得到队列中最后一个元素
实现思路: 一个存放我们数据的栈,每次我们添数据时候把数据放到我们这个data队列中 一个help队列,每次我们data队列出数据时候,将前面的数据都复制导入我们help队列,留最后一个数据弹出.最后交换引用,让help队列成为新的data队列,让空的data队列成为新的help队列
代码实现
代码语言:javascript复制package com.day1.practice;
import java.util.LinkedList;
import java.util.Queue;
public class TwoQueuesToStack {
private Queue<Integer> data;
private Queue<Integer> help;
public TwoQueuesToStack(){
data=new LinkedList<>();
help=new LinkedList<>();
}
public void pushNum(int num){//添加数据
data.add(num);
}
public int popNum(){//移出队列中最后一个数据
if (data.isEmpty()) {
throw new RuntimeException("Stack is empty!");
}
while (data.size()!=1){//用help接收除了最后一个数据的其他全部数据
help.add(data.poll());
}
int res=data.poll();
swap();
return res;
}
public int peek(){ //只看数据,不弹最后一个数据
if (data.isEmpty()) {
throw new RuntimeException("Stack is empty!");
}
while (data.size()!=1){
help.add(data.poll());
}
int res=data.poll();
help.add(res);
swap();
return res;
}
private void swap(){
Queue<Integer> temp=help;//用temp指向现在不空的数据队列
help=data;//让help指向现在空的队列
data=temp;//让data指向刚刚绑定的temp队列,即真正的数据队列
//以上三步达到一个引用交换的目的
}
//test
public static void main(String[] args){
TwoQueuesToStack test=new TwoQueuesToStack();
test.pushNum(12);
test.pushNum(14);
test.pushNum(11);
test.pushNum(15);
System.out.print(test.popNum() " ");
System.out.print(test.popNum() " ");
}
}