栈和队列相互实现
来源:互联网 发布: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
- 栈和队列相互实现
- 栈和队列的相互实现
- 栈和队列的相互实现
- 栈和队列的相互实现
- 栈和队列的相互实现
- 栈与队列相互实现
- 队列与栈相互实现
- 栈与队列的相互实现
- 栈与队列的相互实现
- 栈和队列的相互模拟
- 栈和队列的相互模拟
- 队列和栈的相互表示
- 栈和队列的相互转换替代
- 栈和队列的相互转换
- 栈,队列 以及 stack, queue 的相互实现
- 栈,队列 以及 stack, queue 的相互实现 .
- 每日一题之队列与栈的相互实现
- 队列实现栈和栈实现队列
- 常用排序算法
- CentOS 64位安装配置Hadoop-2.6.0
- PKU 1401 Factorial 有一个计算公式
- copy和mutableCopy
- uva1626 poj 1141 Brackets Sequence 区间dp 打印路径
- 栈和队列相互实现
- 【LeetCode】Permutations
- Start – Modern minimalist OpenCart 2.X 自适应主题模板 ABC-0573-04
- CSDN博客(专家)如何使用量子恒道统计访问量
- 黑马程序员—OC语言基础—方法小结
- 这个是借鉴一个朋友的关于IOS的资料
- 定位bug技巧
- C# 判断是否为数字
- 【Objective-C学习-11】NSArray的排序