C++实现一个简单的双栈队列

Posted TssiNG-Z

tags:

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

双栈队列的原理是用两个栈结构模拟一个队列, 一个栈A模拟队尾, 入队的元素全部压入此栈, 另一个栈B模拟队首, 出队时将栈A的元素弹入栈B, 将栈B的栈顶元素弹出

此结构类似汉诺塔, 非常经典, 这里附上C++代码简单实现, 有问题欢迎指出

 1 #include <stack>
 2 
 3 template <typename T>
 4 class CStkQueue
 5 {
 6 public:
 7   T      queuePop();          //出队列
 8   void   queuePush(T value);  //入队列
 9   size_t queueSize();         //队列长度
10   bool   queueEmpty();        //队列判空
11 
12 private:
13   std::stack<T> std_stack_push;  //入栈,模拟队尾
14   std::stack<T> std_stack_pop;   //出栈,模拟队首
15 };
16 
17 
18 template <typename T>
19 T CStkQueue<T>::queuePop()
20 {
21   T temp;  //返回值
22 
23   //如果出栈不为空,直接将出栈的栈顶元素弹出
24   if (!std_stack_pop.empty())
25   {
26     temp = std_stack_pop.top();
27     std_stack_pop.pop();
28     return temp;
29   }
30 
31   //将入栈元素弹出并压进出栈至仅剩一个元素
32   while (std_stack_push.size() != 1)
33   {
34     std_stack_pop.push(std_stack_push.top());
35     std_stack_push.pop();
36   }
37 
38   //将入栈仅有的一个元素作为返回值弹出
39   temp = std_stack_push.top();
40   std_stack_push.pop();
41   return temp;
42 }
43 
44 template <typename T>
45 void CStkQueue<T>::queuePush(T value)
46 {
47   //如果出栈不为空,先将出栈元素弹回入栈
48   while (!std_stack_pop.empty())
49   {
50     std_stack_push.push(std_stack_pop.top());
51     std_stack_pop.pop();
52   }
53   
54   //元素压栈
55   std_stack_push.push(value);
56 }
57 
58 template <typename T>
59 size_t CStkQueue<T>::queueSize()
60 {
61   return (std_stack_push.size() + std_stack_pop.size());
62 }
63 
64 template <typename T>
65 bool CStkQueue<T>::queueEmpty()
66 {
67   return ((std_stack_push.size() + std_stack_pop.size()) == 0) ? true : false;
68 }

 

下面做个简单的测试

结果如下

以上是关于C++实现一个简单的双栈队列的主要内容,如果未能解决你的问题,请参考以下文章

双栈实现队列剑指 Offer 09. 用两个栈实现队列

AWS ELB 中的双栈前缀是啥意思?

leetcode每日一题--有效括号的字符串匹配(双栈模拟)

Dijkstra的双栈算术表达式求值算法

Dijkstra的双栈算术表达式的求值算法

使用 ActionBar 旋转 Android 的双片段