两个栈模拟一个队列,1号栈为入队,栈顶表示队尾;2号栈为出队,栈顶表示队首。
入队,直接进1号栈;出队,先判断2号栈是否有元素,有元素就直接弹出栈顶即队首,如果2号栈没有元素,则将1号栈的元素顺序弹出并进2号栈。
[cpp] view
plaincopy
- #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;
- }
时间: 2024-10-10 21:41:41