1- 如何仅用队列结构实现栈结构?
使用两个队列,一个data队列一个help队列.
加入压栈五个数之后要弹出第五个数,两个队列的操作就是,压栈五个数正常存入data队列,弹栈的时候前四个数先进help队列,data队列中的数当做弹栈的数据返回,然后help和data队列互换引用.
import java.util.LinkedList;
import java.util.Queue;
public class QueueStack {
private Queue<Integer> data;
private Queue<Integer> help;
QueueStack(){
this.data = new LinkedList<Integer>();
this.help = new LinkedList<Integer>();
}
public void push( Integer integer){
this.data.add(integer);
}
public Integer peek(){
if (this.data.size() == 0){
throw new RuntimeException("stack is empty");
}
while (data.size() != 1){
help.add(data.poll());
}
Integer res = data.peek();
help.add(data.poll());
swap();
return res;
}
public Integer poll(){
if (data.isEmpty()){
throw new RuntimeException("stack is empty");
}
while (data.size() > 1) {
help.add(data.poll());
}
Integer res = data.poll();
swap();
return res;
}
private void swap(){
Queue<Integer> temp = data;
data = help;
help = temp;
}
}
2- 如何仅用栈结构实现队列结构?
两个栈结构顶替一个队列.将data栈的数据swap到help栈,这样经过一次传递之后,数据顺序就恢复成了先进先出.
需要注意,在data和help数据传递的过程中,如果help不是空的是不可以传输数据的.
import java.util.Stack;
public class StackQueue {
private Stack<Integer> data;
private Stack<Integer> help;
StackQueue(){
this.data = new Stack<Integer>();
this.help = new Stack<Integer>();
}
//push peek pull swap
public void push(Integer integer){
this.data.push(integer);
}
public Integer pull(){
swap();
return help.pop();
}
public Integer peek(){
swap();
return help.peek();
}
private void swap(){
if (data.isEmpty() || help.isEmpty()){
throw new RuntimeException("queue is empty");
}else if(!help.isEmpty()){
return;
}
while(!data.isEmpty()){
help.add(data.pop());
}
}
}