前面说了用两个栈实现一个队列的算法,现在在写一个反过来的算法:
1.算法描述:
栈的特点就是先进后出,而队列的特点就是先进先出,基于两者的特点,有了此算法:
先看一张图:都喜欢图,图也能直接表达题的意思和本人的意思:
图中已经说的很清楚了,多余的方法暂且不说,按以上的图和思路,我给出以下代码:供自己参考:
/* *设有两个队列A和B,栈的push操作,直接push到A的队尾就行了。 *栈的pop操作时,将A中的队列依次取出放到B中,取到最后一个时, *最后一个不要放到B中,直接删掉,再将B中的值依次放回A中。 *栈的top操作时,将A中的队列依次取出放到B中,取到最后一个时, *将最后一个值记录下来,再将最后一个值放到B中,再将B中的值依次放回到A中 */ #include<iostream> #include <queue> using namespace std; template<class T> class Mystack { public: Mystack() {} ~Mystack() {} public: void Push(T value); T Top(); T Pop(); private: queue<T> Queue1; queue<T> Queue2; }; //入栈 template<class T> void Mystack<T>::Push(T a) { Queue1.push(a); } //栈顶 template<class T> T Mystack<T>::Top() { return Queue1.back();//???????????这里是否可以 } //出栈 template<class T> T Mystack<T>::Pop() { int node = 0; while(Queue1.back() != Queue1.front()) { int num = Queue1.front(); Queue2.push(num); Queue1.pop(); } node = Queue1.back(); Queue1.pop(); while(!Queue2.empty()) { int num = Queue2.front(); Queue1.push(num); Queue2.pop(); } return node; } void Test() { Mystack<int> s1; s1.Push(1); s1.Push(2); s1.Push(3); s1.Push(4); s1.Push(5); cout<<s1.Top()<<endl; for(int i = 0; i < 5; i++) { cout<<s1.Pop()<<"->"; } cout<<"NULL"<<endl; } int main() { Test(); return 0; }
时间: 2024-10-18 18:58:13