使用两个队列模拟一个栈

Posted 今天学什么

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用两个队列模拟一个栈相关的知识,希望对你有一定的参考价值。

准备笔试,在看相关知识,看到这个问题,如何使用两个队列模拟一个栈,在参考了相关知识下,实现了代码如下:

 1     public class Stack<E>{
 2         Queue<E> q1 = null; //队列q1提供压栈功能,
 3         Queue<E> q2 = null; //队列q2提供弹栈功能
 4         
 5         public Stack(){
 6             q1 = new LinkedList<E>();
 7             q2 = new LinkedList<E>();
 8         }
 9         //判断栈是否为空
10         public synchronized boolean isEmpty(){
11             return q1.isEmpty()&&q2.isEmpty();
12         }
13         
14         //统计栈中元素个数
15         public synchronized int size(){
16             return q1.size()+q2.size();
17         }
18         
19         //入栈
20         public synchronized void push(E data){
21             q1.add(data);
22         }
23         
24         //出栈
25         public synchronized E pop(){
26             E temp = null;
27             //如队列q1只有一个元素,q1直接取队首元素并输出
28             if(q1.size()==1)
29                 temp = q1.poll();
30             
31             //如队列q1不止一个元素,q1取队首元素并放入q2中,直到倒数第二个元素,最后一个元素输出,
32             //然后再将q2中元素入队列q1
33             if(q1.size()>1){
34                 for(int i=0;i<q1.size();i++){
35                     q2.add(q1.poll());
36                 }
37                 
38                 temp=q1.poll();  //取队列q1最后一个元素
39                     
40                 while(!q2.isEmpty()){//再将q2中元素入队列q1
41                     q1.add(q2.poll());
42                 }
43             }
44             return temp;
45         }
46         
47         //取栈顶元素
48         public synchronized E peek(){
49             E temp = null;
50             //如队列q1只有一个元素,q1直接取队首元素并输出
51             if(q1.size()==1)
52                 temp = q1.peek();
53             
54             //如队列q1不止一个元素,q1取队首元素并放入q2中,直到倒数第二个元素,最后一个元素输出,
55             //然后再将q2中元素入队列q1
56             if(q1.size()>1){
57                 for(int i=0;i<q1.size();i++){
58                     q2.add(q1.poll());
59                 }
60                 temp=q1.peek();
61                     
62                 while(!q2.isEmpty()){
63                     q1.add(q2.poll());
64                 }
65             }
66             return temp;
67         }
68     }

 

以上是关于使用两个队列模拟一个栈的主要内容,如果未能解决你的问题,请参考以下文章

数据结构和算法之栈和队列一:两个栈模拟一个队列以及两个队列模拟一个栈

使用两个栈模拟一个队列

两个栈模拟一个队列

用两个队列模拟实现一个栈的过程

如何使用栈模拟一个队列

剑指offer:两个队列模拟一个栈