如何使用栈模拟一个队列

队列先进先出。

栈先进后出。

最近看到一道面试题,要求用两个栈模拟一个队列,这个问题在一年前遇到过,记录一下。

使用栈模拟队列,一个肯定不行,首先想到用两个栈来模拟队列。

当队列有数据要入队时,我们同时将这个数据入栈A

此时我们认为,第一次向队列中插入数据完成了。则我们将A中的数据弹出,使用B来接收这些值。

就这样将A中的元素全部弹出并且压进B中,这时就会发现,他们顺序逆转,并且如同队列一样,先进的元素到了栈顶,可以先出。

我们让1出队之后,此时我们还想继续向队列中添加数据。

此时,2依然是栈B放在栈顶的元素。此时有新的元素加入,我们依然采取刚才的方法,在新数据入队时,插入数据到栈A中。

插入栈A之后,我们可以对栈B进行判断,如果栈B中还存有元素,则这名刚才添加的元素尚未全部出队,他们仍然遵守先进先出的原则。

当栈B中的元素全部弹出之后,我们就可以将栈A中的元素再次弹出并压进栈B,此时又实现了先进先出。

代码实现:

  1. private Stack<Integer> stackA = new Stack<Integer>();
  2. private Stack<Integer> stackB = new Stack<Integer>();
  3. /**
  4. * 入队操作
  5. * @param element 入队的元素
  6. */
  7. public void enQueue(int element) {
  8. stackA.push(element);
  9. }
  10. /**
  11. * 出队操作
  12. */
  13. public Integer deQueue() {
  14. if(stackB.isEmpty()){
  15. if(stackA.isEmpty()){
  16. return null;
  17. }
  18. transfer();
  19. }
  20. return stackB.pop();
  21. }
  22. ``
  23. ``
  24. /**
  25. * 栈A元素转移到栈B
  26. */
  27. private void transfer(){
  28. while (!stackA.isEmpty()){
  29. stackB.push(stackA.pop());
  30. }
  31. }
  32. ``
  33. ``
  34. public static void main(String[] args) throws Exception {
  35. StackQueue stackQueue = new StackQueue();
  36. stackQueue.enQueue(1);
  37. stackQueue.enQueue(2);
  38. stackQueue.enQueue(3);
  39. System.out.println(stackQueue.deQueue());
  40. System.out.println(stackQueue.deQueue());
  41. stackQueue.enQueue(4);
  42. System.out.println(stackQueue.deQueue());
  43. System.out.println(stackQueue.deQueue());
  44. }

原文地址:https://www.cnblogs.com/easilyai/p/9834027.html

时间: 2024-10-05 05:07:51

如何使用栈模拟一个队列的相关文章

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

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

两个栈模拟一个队列和两个队列模拟一个栈

此为网易的一道笔试题.到时候秀逗,不知所云.后来研究之后记录下,以备以后经常翻阅. 栈:先进后出 push和pop 队列:先进先出 offer和poll (1)两个栈模拟一个队列 即将先进后出实现先进先出.比较容易理解,只要所有数据先往一个栈里push,然后将该栈中的数据依次pop出来再push进第二个队列,则顺序自然颠倒过来了,则每次pop是从第二个队列中取数据. import java.util.*; public class StackQueue{ private Stack<Intege

两个栈模拟一个队列

两个栈模拟一个队列,1号栈为入队,栈顶表示队尾:2号栈为出队,栈顶表示队首. 入队,直接进1号栈:出队,先判断2号栈是否有元素,有元素就直接弹出栈顶即队首,如果2号栈没有元素,则将1号栈的元素顺序弹出并进2号栈. [cpp] view plaincopy #include <iostream> #include <stack> #include <assert.h> using namespace std; template<typename T> clas

使用两个栈模拟一个队列

接着上一篇"使用两个队列模拟一个栈",这里该如何使用两个栈模拟一个队列呢?具体实现如下: 1 public class Queue<E>{ 2 private Stack<E> s1 = null; //s1作为插入栈 3 private Stack<E> s2 = null; //s2作为弹出栈 4 5 public Queue(){ 6 s1 = new Stack<E>(); 7 s2 = new Stack<E>();

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

今天我们需要学习的是关于数据结构里面经常看到的两种结构,栈和队列.可以说我们是一直都在使用栈,比如说在前面递归所使用的的系统的栈,以及在链表倒序输出时介绍的自定义栈类Stack和使用系统的栈进行递归.那么,在这里我们就讲述一下这两个比较具有特色的或者说关系比较紧密的数据结构之间的互相实现问题. 一:两个栈模拟实现一个队列: 栈的特点是先进后出,然而队列的特点是先进先出. public class Queen(Stack s1,Stack s2){ //实现插入的方法 public void ad

剑指offer:用两个栈实现一个队列

题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 类似汉诺塔,当我们需要将栈A下面的元素出栈的时候可以先将栈A中的元素全部逆序压入到另一个栈B,这时栈B保存的就是栈A的逆序,也就是满足了FIFO的要求 class Solution: """ 用两个栈模拟一个队列,如果两个栈的容量分别为M和N,其中M > N,那么模拟得到的队列的容量是2N+1 因为假设先把stack2塞满N个,然后此时stack1塞进N+2个,那么此时将元素出

使用两个栈实现一个队列

使用两个栈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来存储,当出队的时候,先把