* 用两个队列实现栈
* 思路就是:
* 找两个队列,一个data队列用来存储数据,一个help队列是辅助
* 在push的时候 直接插入到data中,在poll或者peek的时候先把data队列的前n-1个元素push到help中
* 这时候data剩下的一个就是我们需要的,满足栈先进后出的元素
* 然后我们再把help变为空 这时候只需要把data 与help的引用互相交换即可,
* 注意在peek()的时候,需要你把data也poll出去然后再push进help里面
* 用两个栈模拟队列
* 思路就是 一个data 一个help
* push 的时候直接push进data
* pop 或者peek的时候先从data里面拿出去放到help中 再从help使用pop() 方法就是先进先出的顺序了
/**
* 用两个栈实现队列或者用俩个队列实现栈
* @author zhx
*/
public class StackAndQueueConvert {
/**
* 用两个队列实现栈
* 思路就是:
* 找两个队列,一个data队列用来存储数据,一个help队列是辅助
* 在push的时候 直接插入到data中,在poll或者peek的时候先把data队列的前n-1个元素push到help中
* 这时候data剩下的一个就是我们需要的,满足栈先进后出的元素
* 然后我们再把help变为空 这时候只需要把data 与help的引用互相交换即可,
* 注意在peek()的时候,需要你把data也poll出去然后再push进help里面
*/
public static class TwoQueuesStack{
Queue<Integer> queueData;
Queue<Integer> queueHelp;
public TwoQueuesStack(){
this.queueData = new LinkedList<>();
this.queueHelp = new LinkedList<>();
}
public Integer poll(){
if(queueData.isEmpty()){
throw new RuntimeException("queue is empty");
}
while (queueData.size() > 1){
this.queueHelp.add(this.queueData.poll());
}
Integer a = this.queueData.poll();
swap();
return a;
}
public Integer peek(){
if(queueData.isEmpty()){
throw new RuntimeException("queue is empty");
}
while (queueData.size() > 1){
this.queueHelp.add(this.queueData.poll());
}
Integer a = this.queueData.poll();
this.queueHelp.add(a);
swap();
return a;
}
public void push(int val){
this.queueData.add(val);
}
public void swap(){
Queue temp = this.queueHelp;
this.queueHelp = this.queueData;
this.queueData = temp;
}
}
/**
* 用两个栈模拟队列
* 思路就是 一个data 一个help
* push 的时候直接push进data
* pop 或者peek的时候先从data里面拿出去放到help中 再从help使用pop() 方法就是先进先出的顺序了
*/
public static class TwoStaccksQueue{
Stack<Integer> data;
Stack<Integer> help;
public TwoStaccksQueue(){
this.data = new Stack<>();
this.help = new Stack<>();
}
public void push(int val){
data.push(val);
}
public Integer pop(){
if (data.isEmpty() && help.isEmpty()){
throw new RuntimeException("queue is null");
}else if(help.isEmpty()){
while (!data.isEmpty()){
help.push(data.pop());
}
}
return help.pop();
}
}
}