1.用两个栈实现队列 2.用两个队列实现一个栈
2015-04-23 15:53
274 查看
1.用两个栈实现队列
编程思想:添加元素全都放入栈sta,出栈元素都从栈stb退出。当stb非空时,直接进行元素出栈实现队列。只有在栈stb为空,且sta非空的情况下,将sta中所有的元素一次性加入stb,(stb为空,sta为空,队列空)再进行元素出栈。
2.两个队列实现一个栈
编程思想:
添加元素全都放入队列que1,(假如有三个元素abc依次进入que1,如果想要删除栈顶元素,则将que1中元素ab已入que2中,此时que1中只有一个元素c,输出c)整体采用类似思想。因为每次都是从que1加入元素,所以每次先判断que1中元素个数n(后入先出),如果为n=1,直接输出,n>1的话将将其与n-1个元素转移到que2在输出剩下一个元素。如过n=0,则判断que2中元素个数m,如果为m=1,直接输出,m>1的话将将其与m-1个元素转移到que1,在输出剩下一个元素。
若n=0,m=0,栈空。
编程思想:添加元素全都放入栈sta,出栈元素都从栈stb退出。当stb非空时,直接进行元素出栈实现队列。只有在栈stb为空,且sta非空的情况下,将sta中所有的元素一次性加入stb,(stb为空,sta为空,队列空)再进行元素出栈。
Quene核心代码 void appendTail( ElementType data)//入队 { stack1.push(data); } ElementType deleteHead()//出队 { if(stack2.size()==0) { while(stack1.size()>0) { temp=stack1.top; stack2.push(temp); stack1.pop(); } } if(stack2.size()==0) cout<<"queue empty!"; head=stack2.top(); stack2.pop(); return head; } 实现代码: #include <iostream> #include <vector> using namespace std; typedef int elemType; class Stack { public: vector<elemType> vec;//用vector实现栈 public: void push(elemType data)//入栈 { vec.push_back(data); } elemType top()//返回栈顶元素值 { if(vec.size()) return vec.back(); else cout<<"stack empty!"<<endl; } void pop()//删除栈顶元素 { if(vec.size()) vec.pop_back(); else cout<<"stack empty!"<<endl; } elemType size()//栈大小 { return vec.size(); } bool empty()//栈是否为空 { return vec.empty(); } } ; class Queue { public: Stack sta; Stack stb; public: void push(elemType data)//入队 { sta.push(data); } elemType front()//返回对首元素的值 { while(stb.size()==0) { while(sta.size()!=0) { stb.push(sta.top()); sta.pop(); } } if(stb.size()==0) cout<<"queue empty!"<<endl; return stb.top(); } void pop()//删除队首元素 { if(stb.size()!=0) stb.pop(); } elemType size()//队列的大小 { return sta.size()+stb.size(); } bool empty()//队列是否为空 { if(sta.size()+stb.size()==0) return true; else return false; } }; int main() { Queue que; for(int i=1;i<=5;i++) que.push(i); for(int i=1;i<=3;i++) { cout<<que.front()<<" "; que.pop(); } que.push(6); que.push(7); cout<<endl<<que.size()<<endl; for(int i=1;i<=4;i++) { cout<<que.front()<<" "; que.pop(); } return 0; } 同样可以利用系统提供的适配器stack #include <iostream> #include <vector> #include <stack> using namespace std; typedef int elemType; class Queue { public: stack<int> sta; stack<int> stb; public: void push(elemType data)//入队 { sta.push(data); } elemType front()//返回对首元素的值 { while (stb.size() == 0) { while (sta.size() != 0) { stb.push(sta.top()); sta.pop(); } } if (stb.size() == 0) cout << "queue empty!" << endl; return stb.top(); } void pop()//删除队首元素 { if (stb.size() != 0) stb.pop(); } elemType size()//队列的大小 { return sta.size() + stb.size(); } bool empty()//队列是否为空 { if (sta.size() + stb.size() == 0) return true; else return false; } }; int main() { Queue que; for (int i = 1; i <= 5; i++) que.push(i); for (int i = 1; i <= 3; i++) { cout << que.front() << " "; que.pop(); } que.push(6); que.push(7); cout << endl << que.size() << endl; for (int i = 1; i <= 4; i++) { cout << que.front() << " "; que.pop(); } return 0; }
2.两个队列实现一个栈
编程思想:
添加元素全都放入队列que1,(假如有三个元素abc依次进入que1,如果想要删除栈顶元素,则将que1中元素ab已入que2中,此时que1中只有一个元素c,输出c)整体采用类似思想。因为每次都是从que1加入元素,所以每次先判断que1中元素个数n(后入先出),如果为n=1,直接输出,n>1的话将将其与n-1个元素转移到que2在输出剩下一个元素。如过n=0,则判断que2中元素个数m,如果为m=1,直接输出,m>1的话将将其与m-1个元素转移到que1,在输出剩下一个元素。
若n=0,m=0,栈空。
#include <iostream> #include <vector> #include <queue> using namespace std; typedef int elemType; class Stack { public: queue<int> que1; queue<int> que2; public: void push(elemType data)//入栈 { que1.push(data); } elemType top()//返回栈顶元素值 同时删除 { if (que1.size() + que2.size() == 0) { cout << "stack empty!" << endl; return 0; } while (que1.size() > 1) { que2.push(que1.front()); que1.pop(); } if (que1.size() == 1) { int temp=que1.front(); que1.pop(); return temp; } while (que2.size() > 1) { que1.push(que2.front()); que2.pop(); } if (que2.size() == 1) { int temp = que2.front(); que2.pop(); return temp; } } void pop()//删除栈顶元素只能在top内实现,因为每次删除元素所在队列不确定。 { } int size() { return que1.size() + que2.size(); } bool empty() { if (que1.size() + que2.size() == 0) { return true; } return false; } } ; int main() { Stack sta; for (int i = 1; i <= 5; i++) sta.push(i); for (int i = 1; i <= 3; i++) { cout << sta.top() << " "; } sta.push(6); sta.push(7); cout << endl << sta.size() << endl; for (int i = 1; i <= 4; i++) { cout << sta.top() << " "; } system("pause"); return 0; }
相关文章推荐
- 包含min函数的栈和两个栈实现一个队列
- 用两个栈实现一个队列
- C++算法之 两个队列实现一个栈
- 两个栈实现一个队列
- 用两个栈实现一个队列以及用两个队列实现一个栈
- 两个栈实现一个队列
- 用两个栈实现一个队列,用两个队列实现一个栈,C++ STL版
- 每天一个小算法(6)---- 通过两个栈实现一个队列
- 两个栈实现一个队列
- 两个栈实现一个队列
- 用两个stack实现一个队列
- 面试题7_使用两个栈实现一个队列的功能
- 记一道面试题:STL两个栈实现一个队列。
- 2.用两个顺序存储结构的栈实现一个队列
- 【C++】两个队列实现一个栈
- 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
- 两个栈实现一个队列
- 用两个栈实现一个队列
- 用两个队列实现一个栈
- 用两个栈实现一个队列的功能