栈和队列的相互实现

注:本文转载自互联网,有改动,感谢作者zgh1988的整理!

以STL中Queue和Stack为例:

 

1.Queue和Stack的特点

Queue支持的操作:

     queue<int>
     void push(int elem)                              //向队列中添加元素
     void pop()                                          //从队列中删除头元素,即先进入的先出去
     int front();                                         //返回队列中的头元素,即队列中最先进入的元素
     int back();                                         //返回队列中的末尾元素,即队列中的最后进入的元素
     int size() const;                                  //返回队列中元素的个数
     bool empty() const ;                            // 判断队列是否为空,空返回true,非空返回false

 

Stack支持的操作:


    void push(int elem);                             // 向栈中添加一个元素
    void pop();                                              //删除栈中的一个元素,即最后进入的元素
    int top() const;                                       // 返回栈中的头元素,即最后进入的元素。
    int size() const;                                     // 返回栈中元素的个数
    bool empty() const;                             // 判断栈是否为空,空返回true,非空返回false;

 

2.用两个队列实现一个栈:

     (1) 使用两个队列 q1, q2, 还有两个bool变量 q1_used, q2_used,分别表示q1是否在使用,q2是否在使用,两者只有一个在使用,另一个不在使用。初始状态为 q1_used = true;  q2_used = false;即此时q1在使用,q2闲置。
     (2) 实现栈的push操作,首先判断q1_used,q2_used,然后找出正在使用队列,将其添加到队列中。例如q1_used == true;  则将元素添加到队列q1;  反之q2_used == true,则将元素添加到队列q2中。
     (3) 实现栈的pop操作,首先判断q1_used ,q2_used,找出正在使用的队列,然后将在使用的队列元素取出来,放到闲置的队列中,删除队列最后一个元素。然后修改q1_used, q2_used.
            例如初始状态为q1_used = true,a,b,c入栈,则将其插入队列q1中,然后执行出栈操作pop,则将a,b从q1中出队列,然后进入q2,将c进行pop操作。 

                                                        
     (4)执行top操作,判断q1_used q2_used,然后找出正在使用的队列,利用该队列函数back(),返回栈头元素值。
       5) 至于size()和empty()操作,就对正在使用的队列,执行size()和empty()函数,返回值。

     

 1 #ifndef STACK_H
 2 #define STACK_H
 3 
 4 #include <queue>
 5 #include <iostream>
 6 
 7 template <typename T>
 8 class Stack {
 9 private:
10  std::queue<T> q1;
11  std::queue<T> q2;
12  bool q1_used, q2_used;
13 public:
14  Stack();
15  void push(T elem);
16  void pop();
17  T top() const;
18  bool empty() const;
19  int size() const;
20 };
21 
22 template <typename T>
23 Stack<T>::Stack() {
24  q1_used = true;
25  q2_used = false;
26 }
27 
28 template <typename T>
29 void Stack<T>::push(T elem) {
30  if(q1_used == true) {
31   q1.push(elem);
32  }
33  if(q2_used == true) {
34   q2.push(elem);
35  }
36 }
37 
38 template <typename T>
39 void Stack<T>::pop() {
40  if(!q1.empty() && q1_used == true) {
41   while(q1.size() != 1) {
42    q2.push(q1.front());
43    q1.pop();
44   }
45   q1.pop();
46   q2_used = true;
47   q1_used = false;
48   return;
49  }
50  if(!q2.empty() && q2_used == true) {
51   while(q2.size() != 1) {
52    q1.push(q2.front());
53    q2.pop();
54   }
55   q2.pop();
56   q2_used = false;
57   q1_used = true;
58   return;
59  }
60  std::cout << "error! Stack::pop()" << std::endl;
61 }
62 
63 template <typename T>
64 T Stack<T>::top() const {
65  if(!q1.empty() && q1_used == true) {
66   return q1.back();
67  }
68  else if(!q2.empty() && q2_used == true) {
69   return q2.back();
70  }
71  std::cout << "error! Stack::top()" << std::endl;
72  return 0;
73 }
74 
75 template <typename T>
76 bool Stack<T>::empty() const {
77  return q1.empty() && q1_used == true || q2.empty() && q2_used == true;
78 }
79 
80 template <typename T>
81 int Stack<T>::size() const {
82  if(!q1.empty() && q1_used == true) {
83   return q1.size();
84  }
85  if(!q2.empty() && q2_used == true) {
86   return q2.size();
87  }
88  return 0;
89 }
90 
91 #endif

 

3.两个栈实现一个队列:

     (1):两个栈S1,S2,S1负责数据的压入(Enqueue),S2负责数据的弹出(Dequeue);

     (2):初始状态两个栈都为空;

     (3):压入数据时,压入S1;

     (4):弹出数据时候,如果S2为空,则将S1中所有数据项弹出然后压入S2(倒序进入S2),然后弹出S2的栈顶元素;如果S2不为空,则直接弹出S2栈顶元素;如果S2为空且S1为空,则队列为空。

     例如对a,b,c实现push操作,然后实现pop操作:

                               

 

 1 #ifndef QUEUE_H
 2 #define QUEUE_H
 3 #include <iostream>
 4 #include <stack>
 5 
 6 template<typename T>
 7 class Queue {
 8 private:
 9  std::stack<T> s1;
10  std::stack<T> s2;
11  T back_elem;
12 public:
13  void push(T elem);
14  void pop();
15  T front();
16  T back();
17  int size() const;
18  bool empty() const;
19 };
20 
21 template<typename T>
22 void Queue<T>::push(T elem) {
23  s1.push(elem);
24  back_elem = elem;
25 }
26 
27 template<typename T>
28 void Queue<T>::pop() {
29  if(!s2.empty()) {
30   s2.pop();
31  }
32  else if(!s1.empty()) {
33   while(!s1.empty()) {
34    s2.push(s1.top());
35    s1.pop();
36   }
37   s2.pop();
38  }
39  else {
40   std::cout << "error pop(), empty queue!" << std::endl;
41  }
42 }
43 
44 template<typename T>
45 T Queue<T>::front(){
46  if(!s2.empty()) {
47   return s2.top();
48  }
49  else if(!s1.empty()) {
50   while(!s1.empty()) {
51    s2.push(s1.top());
52    s1.pop();
53   }
54   return s2.top();
55  }
56  else {
57   std::cout << "error front(), empty queue!" << std::endl;
58  }
59 }
60 
61 template<typename T>
62 T Queue<T>::back(){
63  if(!empty())
64   return back_elem;
65  else {
66   std::cout << "error back(), empty queue!" << std::endl;
67   return 0;
68  }
69 }
70 
71 template<typename T>
72 int Queue<T>::size() const {
73  return s1.size() + s2.size();
74 }
75 
76 template<typename T>
77 bool Queue<T>::empty() const {
78  return s1.empty() && s2.empty();
79 }
80 
81 #endif

 

转载于:https://www.cnblogs.com/lixiaohui-ambition/archive/2012/09/25/2701588.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值