一问题描述
两个栈实现一个队列的操作
appendTail
将要插入的元素push进s1。注意此处不需要,再把s2中的元素导入到s1了,因为s1和s2两者的顺序是相反的。
deleteHead
如果s2中的元素不为空,则直接弹出栈顶
若为空,则需要把s1中的元素依次push进s2中,并删除s2中的栈顶
综上
可以直接插入s1中元素,删除时,若是s2为空,则需要把s1中的元素插入进s2中,然后对s2实行删除操作。
二 代码如下
#include <iostream>
#include <stack>
#include <assert.h>
using namespace std ;
template <class T>
class CQueue
{
public :
CQueue() {}
~CQueue() {}
void appendTail(const T & node) ;
void deleteHead() ;
private :
stack <T> m_stack1 ;
stack <T> m_stack2 ;
} ;
template <class T>
void CQueue<T>::appendTail(const T & node) //添加尾部
{
m_stack1.push(node) ;
}
template <class T>
void CQueue<T>::deleteHead() //删除头部
{
if(!m_stack2.empty())
{
cout<<m_stack2.top()<<endl ;
m_stack2.pop() ;
}
else
{
assert(!m_stack1.empty()) ; //两个栈都为空,则出现异常错误
while(!m_stack1.empty()) //将s1中的元素全部push进s2,最后在s2中=删除栈顶
{
m_stack2.push(m_stack1.top()) ;
m_stack1.pop() ;
}
}
}
int main()
{
CQueue<int> queue ;
/* queue.appendTail(5) ;
queue.appendTail(4) ;
queue.appendTail(3) ;
*/
queue.deleteHead() ;
queue.deleteHead() ;
queue.deleteHead() ;
queue.appendTail(2);
queue.appendTail(1);
queue.deleteHead() ;
queue.deleteHead() ;
queue.deleteHead() ;
queue.deleteHead() ;
system("pause") ;
return 0 ;
}