栈和队列相互实现

来源:互联网 发布:app软件制作 编辑:程序博客网 时间:2024/05/21 15:49

以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
复制代码
0 0
原创粉丝点击