栈是后进先出的方式,队列是先进先出(FIFO)方式。所以将一个栈设置为弹出栈,另一个设置插入栈。
编码前先设定s1为插入栈,s2为弹出栈
比较简单,代码如下
#include <iostream>
#include <stack>
using namespace std;
template <class T>
class MQueue {
private :
stack <T> s1, s2; // S1 push , S2 pop
public :
void push (T data) {
s1.push (data);
}
T pop () {
T ret;
if (s2.empty () && s1.empty ()) {
ret = -1;
cout << "No element" << endl;
return ret;
}
if (s2.empty ()) {
while (!s1.empty ()) {
s2.push (s1.top ());
s1.pop ();
}
}
ret = s2.top ();
s2.pop ();
cout << ret << endl;
//cout << "s1 size is : " << s1.size () << endl;
//cout << "s2 size is : " << s2.size () << endl;
return ret;
}
};
int main ()
{
MQueue <int> mqueue;
mqueue.push (1);
mqueue.push (2);
mqueue.push (3);
mqueue.push (4);
mqueue.pop ();
mqueue.pop ();
mqueue.pop ();
mqueue.pop ();
mqueue.pop ();
mqueue.push (1);
mqueue.push (2);
mqueue.push (3);
mqueue.push (4);
mqueue.pop ();
mqueue.pop ();
mqueue.pop ();
mqueue.pop ();
return 0;
}
这时要注意的是,s2是空的不影响s2出栈,就是说不论s2是不是空的都要执行s2出栈操作。即判断完s2空后不应该使用else