如何用两个栈实现一个队列

在数据结构中,我们都学习过队列和栈,我们知道栈的基本特征是后进先出,这个当然也很好理解,用一句歇后语给大家通俗得解释一下,就是: 砌墙的砖瓦——后来居上。很容易明白,就是后面来的反倒在最上面,当然你取的话,是不是得从最上面开始取呀,很容易明白的。再来说说队列,队列的特征是先进先出,就是说先来的先走,生活中的例子就是排队买票,这个大家都很熟悉了,就是先买到票的人先走,后买到票的人后走。

接下来就进入我们今天的主题,即如何用栈来实现队列?

在这里我们可以通过两个栈来操作。第一个栈中存放入队列的元素,第二栈中存放出队列的元素,在这里我们定义两个栈,命名为:stack1 stack2

首先我们可以将入队列的元素放在栈stack1中,如果要出队列的话,就先执行 stack1.push(stack1.pop()) ,这句代码就可以将stack1中的所有元素全部挪到stack2中,并且在stack2中,从栈顶到栈顶恰好就是元素进入队列的顺序,然后执行出队列的操作,即将stack2中的栈顶元素执行 pop() 操作,这时出栈的元素恰好就是出队列的元素。

进行简单分析后,我就上代码了。

 1 package queue;
 2
 3 import java.util.NoSuchElementException;
 4 import java.util.Stack;
 5
 6 /**
 7  * 用两个栈来实现一个队列
 8  * @author liuxin
 9  *
10  * @param <E>
11  */
12 public class QueueWithTwoStacks<E> {
13     private Stack<E> stack1;
14     private Stack<E> stack2;
15
16     public QueueWithTwoStacks() {
17         stack1 = new Stack<E>();
18         stack2 = new Stack<E>();
19     }
20
21
22
23
24     public boolean isEmpty() {
25         return stack1.isEmpty()&&stack2.isEmpty();
26     }
27
28
29
30     public int size() {
31         return stack1.size()+stack2.size();
32     }
33
34
35
36     public void enQueue(E item) {
37         stack1.push(item);
38     }
39
40     public E deQueue() {
41         if(stack1.isEmpty())
42         {
43             throw new NoSuchElementException("Queue is Empty!!");
44         }
45
46         if(stack2.isEmpty())
47         {
48             while(!stack1.isEmpty())
49             {
50                 stack2.push(stack1.pop());
51             }
52         }
53
54         return stack2.pop() ;
55     }
56
57  }

这就是我关于用栈实现队列的一些理解,若有疑问,可以留言。

时间: 2024-12-18 00:26:04

如何用两个栈实现一个队列的相关文章

用两个栈实现一个队列 &amp; 用两个队列实现一个栈

队列(先进先出)和栈(先进后出)都是常用的经常讨论的基本的数据结构,本文要讨论的是一对有趣的问题:如何用两个栈(队列)实现一个队列(栈),下面将分别说明,并附示例代码. 1.用两个栈实现一个队列 基本思路:初始有两个空栈s1和s2,当入队列是,将元素加入s1,而出队列则从s2出,当然s1与s2之间存在一定的交互. 入队:元素压入栈s1即可. 出队:首先看s2是否为空,若s2为空,则依次弹出s1的元素,加入s2中:若不为空,则不需额外处理: 之后弹出s2中的栈顶元素(即为队列的首元素)删除即可.

使用两个栈实现一个队列

使用两个栈Stack1和Stack2来实现一个队列.其中一个栈作为主存放数据的,另外一个栈作为临时存放数据的栈.具体操作如下: enqueue: 栈Stack1的入栈操作. dequeue:将Stack1中的元素一个一个地全部依次出栈,并且在Stack1出栈的同时把出栈的元素作为参数对Stack2进行入栈操作.这步完成之后,执行Stack2出栈操作,这时就将原先在Stack1中最先入栈的元素弹出.最后再将Stack2中的元素一个一个地全部依次出栈,填到Stack1中. 实现代码如下: /** *

用两个栈实现一个队列

用两个栈实现一个队列的功能 解析: 假设两个栈A和B,且都为空. 可以认为栈A提供入队列的功能,栈B提供出队列的功能. 入队列:入栈A. 出队列: 如果栈B不为空,直接弹出栈B的数据. 如果栈B为空,则依次弹出栈A的数据,放入栈B中,再弹出栈B的数据. 代码如下: #include<iostream> #include<stack> using namespace std; template<class T> struct MyQueue { void push(T &

两个栈实现一个队列

问题描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解法分析: 首先题目要求用两个栈实现一个队列,那么就要先分析为什么这么做.队列的特点就像排队的"先到先得"一样,即先入队的就先出队:而栈则正好相反,特点是"后进先出",那么问题来了怎么用"后进先出"的得到"先进先出"? 传说中最简单通用但效率不高的方法(其实我还真没想到这么做)是,入队的时候用stack1来存储,当出队的时候,先把

web前端面试系列 - 数据结构(两个栈模拟一个队列)

一. 用两个栈模拟一个队列 思路一: 1. 一个栈s1作为数据存储,另一个栈s2,作为临时数据存储. 2. 入队时将数据压人s1 3. 出队时将s1弹出,并压人s2,然后弹出s2中的顶部数据,最后再将剩余数据弹出s2,并压人s1. 思路二: 1. 一个栈s1作为数据存储,另一个栈s2,作为临时数据存储. 2. 入队时,判断s1, 是否为空,如果不为空,则将数据直接压入s1, 如果为空,则将s2中的数据全部倒入s1,在将数据压人s1. 3. 出队时,判断s2, 是否为空,如果不为空,则直接弹出s2

两个栈实现一个队列,两个队列实现一个栈

1.两个栈实现一个队列 有三种思路: 思路一:将stack1作为存储空间,将stack2作为临时缓冲区,入队时,直接压入stac1,出队时,将stack1中的元素依次出栈压入stack2中,再将stack2的栈顶元素弹出,最后将stack2中的元素再倒回给stack1 思路二:入队时,判断stack1是否为空,如果stack1为空,则将stack2中的所有元素都倒入stack1中,再将元素直接压入stack1,否则,直接压入stack1中 出队时,判断stack2是否为空,如果stack2为空,

013使用两个栈实现一个队列(keep it up)

使用两个栈实现一个队列 队列是先进先出的数据结构(FIFO),栈是先进后出的数据结构(FILO), 用两个栈来实现队列的最简单方式是:进入队列则往第一个栈压栈, 出队列则将第一个栈的数据依次压入第二个栈,然后出栈. 两条规则: 1)进队列,则直接压入第一个栈 2)出队列,若果第二个栈不为空,直接pop(),如过第二个栈为空, 则把第一个栈中的数据全部压入第二个栈(第一个栈此时为空). 实际写代码时注意栈为空的情况. 代码: #include <iostream> #include <st

两个栈实现一个队列和两个队列实现一个栈【算法导论课后题】

关于两个栈实现一个队列和两个队列实现一个栈问题,网上有很多资料.这里只描述自己认为操作最少的方法. 两个栈实现一个队列 思想:假设两个栈分别为s1,s2.对s1进行入队,出队时,先判断s2是否为空,如果是则将s1中元素压入s2并弹出最上面元素,如果不是,则直接弹出s2最上面的元素. <span style="font-size:18px;">EnQueue(s1,s2,k){ push(s1,k)</span><span style="font-

[算法学习]两个栈实现一个队列

问题描述: 用两个栈实现一个队列,实现两个方法:入队appendTail,出队deleteHead 分析: 第一眼就能想到两个做法, (1) 入队麻烦出队容易: 声明两个栈,一个是存数据用的栈(dataStack),一个是辅助用的栈(tempStack). 入队操作时,先将dataStack中的所有元素出栈压入tempStack中,然后将要入队的元素压入tempStack中,再将tempStack所有元素出栈到dataStack,至此入队成功,dataStack栈顶元素就是第一个入队的元素(队头