栈和队列的相互模拟

深藏阁楼爱情的钟 2022-08-01 02:55 244阅读 0赞

队列是先进先出的数据结构,栈时先进后出的数据结构,可以使用栈和队列模拟彼此。

两个队列模拟栈

使用C++泛型编程,队列使用STL的queue容器适配器。

主要思想:

两个队列模拟栈时,某时刻要么两个队列均为空,要么有一个队列为空

(1)向栈中push时:如果两个队列均为空,将元素插入某个队列(这里假定插入队列1);

如果某个队列不为空,将元素push到该队列中即可。

(2)从栈中pop时: 如果两个队列均为空,则函数返回即可;

如果某个队列不为空,将该队列的前n-1个元素出队,并依次插入另一个队列,再将最后一个元素pop(最后一个元素就是要)。

  1. //test.h
  2. #ifndef TEST_TEST_H
  3. #define TEST_TEST_H
  4. #include <iostream>
  5. #include <string>
  6. #include <vector>
  7. #include <map>
  8. #include <set>
  9. #include <queue>
  10. #include <stack>
  11. using namespace std;
  12. template <class T>
  13. class Qstack {
  14. private:
  15. queue<T> queue1;
  16. queue<T> queue2;
  17. public:
  18. void display(); //输出所有元素
  19. void push(const T& value); //向栈中插入
  20. void pop(); //从栈中弹出
  21. };
  22. template<typename T>
  23. void Qstack<T>::display() {
  24. if (queue1.size() > 0) {
  25. queue<T> q1(queue1);
  26. while (q1.size() > 0) {
  27. cout << q1.front() << " ";
  28. q1.pop();
  29. }
  30. }
  31. if (queue2.size() > 0) {
  32. queue<T> q2(queue2);
  33. while (q2.size() > 0) {
  34. cout << q2.front() << " ";
  35. q2.pop();
  36. }
  37. }
  38. cout << endl << endl;
  39. }
  40. //注意这里在类模板外定义其成员函数的写法
  41. template<class T>
  42. void Qstack<T>::push(const T& value) {
  43. if (queue2.empty())
  44. queue1.push(value);
  45. else if (queue1.empty())
  46. queue2.push(value);
  47. else {}
  48. }
  49. //这里的pop操作返回void,当栈为空时什么也不做。
  50. //这和STL中栈适配器pop操作行为一致
  51. template<typename T>
  52. void Qstack<T>::pop() {
  53. if (queue1.size() > 0) {
  54. while (queue1.size() > 1) {
  55. queue2.push(queue1.front());
  56. queue1.pop();
  57. }
  58. queue1.pop();
  59. }
  60. else if (queue2.size() > 0) {
  61. while (queue2.size() > 1) {
  62. queue1.push(queue2.front());
  63. queue2.pop();
  64. }
  65. queue2.pop();
  66. }
  67. else {}
  68. return;
  69. }
  70. #endif

测试:

  1. #include "qstack.h"
  2. using namespace std;
  3. int main() {
  4. Qstack<string> s;
  5. s.push("1");
  6. s.push("2");
  7. s.push("3");
  8. s.display();
  9. s.pop();
  10. s.display();
  11. s.push("4");
  12. s.push("5");
  13. s.display();
  14. s.pop();
  15. s.display();
  16. s.pop();
  17. s.display();
  18. }

Center

两个栈模拟队列

使用C++泛型编程,栈使用STL的stack容器适配器。

主要思想:

与“两个队列模拟栈”不同:这个问题中,在某个状态下两个栈可能都不为空。

(1)向队列插入:一律插入stack1中。

(2)从队列取数:如果stack2不为空,直接从stack2中弹出一个元素;

如果stack2为空,那么将stack1中所有元素弹出并插入stack2,然后从stack2中pop一个。

  1. template <typename T>
  2. class CQueue
  3. {
  4. public:
  5. void display();
  6. // 在队列末尾添加一个结点
  7. void appendTail(const T& node);
  8. // 删除队列的头结点
  9. void deleteHead();
  10. private:
  11. stack<T> stack1;
  12. stack<T> stack2;
  13. };
  14. template<typename T>
  15. void CQueue<T>::display() {
  16. stack<T> sq1(stack1);
  17. stack<T> sq2(stack2);
  18. while (sq2.size() > 0) {
  19. cout << sq2.top() << " ";
  20. sq2.pop();
  21. }
  22. while (sq1.size() > 0) {
  23. T data = sq1.top();
  24. sq1.pop();
  25. sq2.push(data);
  26. }
  27. while (sq2.size() > 0) {
  28. cout << sq2.top() << " ";
  29. sq2.pop();
  30. }
  31. cout << endl;
  32. }
  33. template<typename T>
  34. void CQueue<T>::appendTail(const T& element)
  35. {
  36. stack1.push(element);
  37. }
  38. template<typename T>
  39. void CQueue<T>::deleteHead()
  40. {
  41. if(stack2.size()<= 0)
  42. {
  43. while(stack1.size()>0)
  44. {
  45. T& data = stack1.top();
  46. stack1.pop();
  47. stack2.push(data);
  48. }
  49. }
  50. if (stack2.size() > 0)
  51. stack2.pop();
  52. return;
  53. }

剑指offer》中deleteHead函数返回被删除的元素,我认为没必要,因为STL中queue队列的删除返回就是void。当对空queue进行pop操作时,在VS2010下运行时会提示下图所示内容,但是g++下不会有任何提示,程序正确

Center 1

测试:

  1. int main() {
  2. CQueue<int> cq;
  3. cq.appendTail(1);
  4. cq.appendTail(2);
  5. cq.appendTail(3);
  6. cq.appendTail(4);
  7. cq.display();
  8. cq.deleteHead();
  9. cq.deleteHead();
  10. cq.display();
  11. cq.appendTail(5);
  12. cq.appendTail(6);
  13. cq.display();
  14. }

Center 2

发表评论

表情:
评论列表 (有 0 条评论,244人围观)

还没有评论,来说两句吧...

相关阅读

    相关 模拟思想

    栈的特点是:后进先出队列的特点是:先进先出栈模拟队列,就要求元素先进先出,可是栈的特点是后进先出,这就需要两个栈才能模拟队列(符合先进先出的特点)1.先创建两个栈(栈1:...

    相关 理解

    一.栈 1.1 概念 栈 :一种 特殊的线性表 ,其 只允许在固定的一端进行插入和删除元素操作 。 进行数据插入和删除操作的一端称为栈 顶,另一端称为栈底。 栈中的数据元

    相关 相互实现

    前言 栈和队列作为两种典型的线性表,有着非常鲜明甚至可以说是相互对立的特点;栈先进后出(后进先出),队列先进先出(后进后出)。因此,对相同的输入,两者会产生恰好截然相反的

    相关 区别

    1.队列先进先出,栈先进后出。 对插入和删除操作的"限定"。 栈是限定只能在表的一端进行插入和删除操作的线性表。 队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性

    相关 实际应用

    1.将一个非负的十进制整数N转换成其他D进制数。 解决思路,连续取模%和整除/。D进制各数位的产生顺序是从低位到高位,而输出顺序却是从高位到低位,刚好相反,可以考虑使用栈进行