问题:
1、如何仅用队列结构实现栈结构?
2、如何仅用栈结构实现队列结构?
实现思路:
1、使用两个队列结构Queue1和Queue2 ,push操作一样,添加push()到Queue1,pop()核心是把 Queue1 除最后添加的元素"剪切"到 Queue2 ,最后poll()剩下的第一个元素,即为最后添加的元素,最后 再交换Queue1和Queue2和引用。
如: Queue1: 队尾 ---> 5 4 3 2 1 队首
Queue2:
此时先后出队元素 1、2、3、4到Queue2中,Queue1中只剩下最后一个入队的元素5
Queue1: 队尾 ---> 5 队首
Queue2: 队尾 ---> 4 3 2 1 队首
代码实现:
package cn.itcats.array;
import java.util.LinkedList;
import java.util.Queue;
/**
* 如何仅用队列结构实现栈结构?
* @author fatah
*/
public class QueueToStack {
private Queue<Integer> data;
private Queue<Integer> help;
public QueueToStack() {
this.data = new LinkedList<Integer>();
this.help = new LinkedList<Integer>();
}
//正常push添加进入Queue
public void push(int value) {
data.add(value);
}
//当在pop的时候,pop只留下一个元素,并把pop出来的元素加入到help队列中
public int pop() {
if(data.isEmpty()) {
throw new RuntimeException("栈为空");
}
while(data.size() > 1) {
//把data中的元素"剪切"到help队列,直到data只剩下一个元素
help.add(data.poll());
}
//最后一个入队的元素
int res = data.poll();
//swap()交换help和data的引用指向
swap();
return res;
}
public int peek() {
if(data.isEmpty()) {
throw new RuntimeException("栈为空");
}
while(data.size()>1) {
help.add(data.poll());
}
int res = data.poll();
help.add(res);
swap();
return res;
}
public void swap (){
Queue<Integer> temp = help ;
help = data ;
data = temp ;
}
}
2、使用栈结构实现队列结构
思路:
//准备popStack和pushStack
public void stackToQueue(){
if(!popStack.isEmpty){
return ;
}
while(!pushStack.isEmpty){
popStack.push(pushStack.pop);
}
}
注意【重要!!!】
这种方式需要满足两个原则
1、push栈的数据要一次全部"倒"入pop栈
2、当"倒"数据的时候,对向栈不能含有数据,否则会乱套。