两个栈模拟一个队列

两个栈模拟一个队列,1号栈为入队,栈顶表示队尾;2号栈为出队,栈顶表示队首。

入队,直接进1号栈;出队,先判断2号栈是否有元素,有元素就直接弹出栈顶即队首,如果2号栈没有元素,则将1号栈的元素顺序弹出并进2号栈。

[cpp] view
plain
copy

  1. #include <iostream>
  2. #include <stack>
  3. #include <assert.h>
  4. using namespace std;
  5. template<typename T>
  6. class CQueue{
  7. public:
  8. CQueue(){}
  9. ~CQueue(){}
  10. void appendTail(const T& node);//入队
  11. void deleteHead();//出队
  12. T front();//取队首
  13. private:
  14. stack<T> m_stack1;
  15. stack<T> m_stack2;
  16. };
  17. template<typename T>void CQueue<T>::appendTail(const T& node)
  18. {
  19. m_stack1.push(node);
  20. }
  21. template<typename T>void CQueue<T>::deleteHead()
  22. {
  23. if(m_stack2.empty())
  24. {
  25. while(!m_stack1.empty())
  26. {
  27. m_stack2.push(m_stack1.top());
  28. m_stack1.pop();
  29. }
  30. }
  31. assert(m_stack2.size()>0);
  32. m_stack2.pop();
  33. }
  34. template<typename T>T CQueue<T>::front()
  35. {
  36. if(m_stack2.empty())
  37. {
  38. while(!m_stack1.empty())
  39. {
  40. m_stack2.push(m_stack1.top());
  41. m_stack1.pop();
  42. }
  43. }
  44. assert(m_stack2.size()>0);
  45. return m_stack2.top();
  46. }
  47. void main()
  48. {
  49. CQueue<int> q;
  50. q.appendTail(13);
  51. q.appendTail(41);
  52. q.appendTail(86);
  53. q.appendTail(90);
  54. q.appendTail(32);
  55. cout<<q.front()<<"出队"<<endl;
  56. q.deleteHead();
  57. cout<<"队首:"<<q.front()<<endl;
  58. }
时间: 2024-10-10 21:41:41

两个栈模拟一个队列的相关文章

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 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

如何使用栈模拟一个队列

队列先进先出. 栈先进后出. 最近看到一道面试题,要求用两个栈模拟一个队列,这个问题在一年前遇到过,记录一下. 使用栈模拟队列,一个肯定不行,首先想到用两个栈来模拟队列. 当队列有数据要入队时,我们同时将这个数据入栈A 此时我们认为,第一次向队列中插入数据完成了.则我们将A中的数据弹出,使用B来接收这些值. 就这样将A中的元素全部弹出并且压进B中,这时就会发现,他们顺序逆转,并且如同队列一样,先进的元素到了栈顶,可以先出. 我们让1出队之后,此时我们还想继续向队列中添加数据. 此时,2依然是栈B

剑指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来存储,当出队的时候,先把