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 }
下面做个简单的测试
结果如下