算法分析
由于栈是先进后出,队列是先进先出。可以采用两个栈enStack和deStack来模拟队列的行为。队列的基本操作包括入队列、出队列和队列是否为空。入队列时,push元素到enStack;出队列是,从deStack中执行pop操作,如果deStack为空,则从enStack push元素到deStack,然后再执行deStack的pop操作;如果enStack和deStack都为空,则队列为空。
c++代码
#include <stack>
#include <iostream>
using namespace std;
class MyQueue
{
public:
MyQueue(){}
~MyQueue(){}
//入队列
bool EnQueue(int element)
{
enStack.push(element);
return true;
}
//出队列
bool DeQueue(int &element)
{
if(!deStack.empty())
{
element = deStack.top();
deStack.pop();
return true;
}
//如果deStack为空,则将enStack pop到deStack
while(!enStack.empty())
{
deStack.push(enStack.top());
enStack.pop();
}
if(!deStack.empty())
{
element = deStack.top();
deStack.pop();
return true;
}
return false;
}
//队列是否为空
bool IsEmpty()
{
if(enStack.empty() && deStack.empty())
{
return true;
}
return false;
}
private:
stack<int> enStack;
stack<int> deStack;
};
测试代码
int _tmain(int argc, _TCHAR* argv[])
{
MyQueue myQueue;
myQueue.EnQueue(9);
myQueue.EnQueue(8);
myQueue.EnQueue(7);
myQueue.EnQueue(6);
int element = -1;
cout<<"after EnQueue 9,8,7,6"<<endl;
bool ret = false;
for(int i = 0; i < 5; i++)
{
ret = myQueue.DeQueue(element);
if(ret)
{
cout<<"DeQueue element:"<<element<<endl;
}
else
{
cout<<"DeQueue fail"<<endl;
}
cout<<"queue is empty:"<<myQueue.IsEmpty()<<endl;
}
return 0;
}