您的位置:首页 > 产品设计 > UI/UE

[原创] 用两个queue实现stack的功能

2016-03-23 22:04 387 查看
#include <iostream>
#include <queue>

using namespace std;

template <class T>
class doubleQueueToStack
{
private:
queue<T> queueA;
queue<T> queueB;
bool flag = true; // flag True, queueA is active
public:
void push(T elemet);
void pop();
};

template <class T>
void doubleQueueToStack<T>::push(T element){
if(flag == true){
queueA.push(element);
cout <<element << " push to queueA" <<endl;
}
else{
queueB.push(element);
cout <<element << " push to queueB" <<endl;
}
}

template <class T>
void doubleQueueToStack<T>::pop()
{
if(doubleQueueToStack::flag==true){
if(doubleQueueToStack::queueA.empty()){
cout << "no element to pop....." << endl;
return;
}
int n= doubleQueueToStack::queueA.size();
for(int i = 0; i<n-1; i++){ ///(##a)
doubleQueueToStack::queueB.push(queueA.front());
doubleQueueToStack::queueA.pop();
}

cout <<"pop: " << doubleQueueToStack::queueA.front() <<endl;
doubleQueueToStack::queueA.pop();
doubleQueueToStack::flag = false;
}
else{
if(doubleQueueToStack::queueB.empty()){
cout << "no element to pop....." << endl;
return;
}
int n= doubleQueueToStack::queueB.size();
for(int i = 0; i < n-1; i++){ ///(##b)
//cout << doubleQueueToStack::queueB.front() << endl;
doubleQueueToStack::queueA.push(doubleQueueToStack::queueB.front());
doubleQueueToStack::queueB.pop();
}
cout << "pop : " << doubleQueueToStack::queueB.front() <<endl;
doubleQueueToStack::queueB.pop();
doubleQueueToStack::flag = true;
}
}

int main()
{
doubleQueueToStack<double> queueDD;
queueDD.push(11);
queueDD.push(22);
queueDD.push(33);
queueDD.pop();
queueDD.push(44);
queueDD.pop();
queueDD.pop();
queueDD.pop();
queueDD.pop();
return 0;
}


注意,语句(a)(b)处不能用以下语句代替:

for(int i = 0; i<doubleQueueToStack::queueA.size()-1; i++){  ////!!!!! 错误!!!!!
doubleQueueToStack::queueB.push(queueA.front());
doubleQueueToStack::queueA.pop();
}


queueA.size是unsigned类型(size_type), 直接进行运算会出问题,

上述语句执行结果,比正确结果少一次queueA.pop。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: