1.Queue和Stack的特点
Queue支持的操作:
queue<int>
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