核心思想
用两个队列来实现栈,因为栈是后进先出的,而队列是先进先出的,所以必须保持至少有一个空队列,每次入栈的时候都要将入栈元素放到非空队列队尾,当然第一次都是空队列,随便选一个入队就行,出栈时,将非空队列里面的元素依次出队然后入队到另一个空队列中,只剩下一个元素作为出栈元素,这样就满足了栈后进先出的特点。下面附上完整java代码
import java.util.LinkedList;
import org.junit.Test;
public class StackByTwoQueue {
private LinkedList<Integer> queue1=new LinkedList<Integer>();
private LinkedList<Integer> queue2=new LinkedList<Integer>();
public StackByTwoQueue() {
super();
}
/**
* 入栈
* @param ele 要入栈的元素
*/
private void push(Integer ele){//入栈时两个队列至少有一个是空队列
if(isEmpty()){//如果两个队列全是空的,则必须要选择一个队列加入新元素
queue1.add(ele);
return;//提前结束,避免过多的比较
}
//只在非空队列加入新元素
if(!queue1.isEmpty()){
queue1.add(ele);
return;//避免多余的比较,提前结束
}
//只在非空队列加入新元素
if(!queue2.isEmpty()){
queue2.add(ele);
}
}
private boolean isEmpty(){
if(queue1.isEmpty() && queue2.isEmpty()){
return true;
}else{
return false;
}
}
/**
* 出栈
* @return 栈顶元素
*/
private Integer pop(){
if(isEmpty()){
try {
throw new Exception("栈空");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(queue1.isEmpty()){//将非空队列里面的元素依次出队,最后只剩下一个作为出栈元素
while(queue2.size()>1){
queue1.add(queue2.poll());
}
return queue2.poll();
}
if(queue2.isEmpty()){//将非空队列里面的元素依次出队,最后只剩下一个作为出栈元素
while(queue1.size()>1){
queue2.add(queue1.poll());
}
return queue1.poll();
}
return null;
}
@Test
public void testStackByTwoQueue(){
StackByTwoQueue stack=new StackByTwoQueue();
for (int i =0; i <4; i++) {
stack.push(i);
}
while(!stack.isEmpty()){
System.out.print(stack.pop()+" ");
}
}
}