两个栈模拟一个队列,1号栈为入队,栈顶表示队尾;2号栈为出队,栈顶表示队首。
入队,直接进1号栈;出队,先判断2号栈是否有元素,有元素就直接弹出栈顶即队首,如果2号栈没有元素,则将1号栈的元素顺序弹出并进2号栈。
#include <iostream>
#include <stack>
#include <assert.h>
using namespace std;
template<typename T>
class CQueue{
public:
CQueue(){}
~CQueue(){}
void appendTail(const T& node);//入队
void deleteHead();//出队
T front();//取队首
private:
stack<T> m_stack1;
stack<T> m_stack2;
};
template<typename T>void CQueue<T>::appendTail(const T& node)
{
m_stack1.push(node);
}
template<typename T>void CQueue<T>::deleteHead()
{
if(m_stack2.empty())
{
while(!m_stack1.empty())
{
m_stack2.push(m_stack1.top());
m_stack1.pop();
}
}
assert(m_stack2.size()>0);
m_stack2.pop();
}
template<typename T>T CQueue<T>::front()
{
if(m_stack2.empty())
{
while(!m_stack1.empty())
{
m_stack2.push(m_stack1.top());
m_stack1.pop();
}
}
assert(m_stack2.size()>0);
return m_stack2.top();
}
void main()
{
CQueue<int> q;
q.appendTail(13);
q.appendTail(41);
q.appendTail(86);
q.appendTail(90);
q.appendTail(32);
cout<<q.front()<<"出队"<<endl;
q.deleteHead();
cout<<"队首:"<<q.front()<<endl;
}