用两个栈实现一个队列——7

  

,,用两个栈实现一个队列,并实现两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。

,,栈的特点是“先进后出,后进先出”,而队列的特点是“先进先出,后进后出”,因此可以想到只用一个栈是无法完成的,所以会需要两个栈,先将输入的数据都依次放入一个栈遍中,但是先进去的数据会被压在栈底,而栈底的数据是需要最先被取出的,可画图如下:

当要完成在队列头部删除结点这就要用到另外一个栈stack2了,可以将第一个栈遍的栈顶元素依次取出放进另外的栈stack2中,这样stack1中的栈底元素就变成了stack2中的栈顶元素,当需要删除队列头部结点的时候就可以流行出stack2的栈顶元素;

而需要在队列尾部插入结点就往stack1中压入数据:

用两个栈实现一个队列——7

也就是相当于,当stack2不为空的时候,要删除队列头部的结点就从stack2的栈顶中取出数据,如果stack2为空的时候就将遍中的数据全部都从栈顶取出依次放入stack2中,然后再取出stack2的栈顶元素,而要在队列尾部插入结点的时候就直接往stack1里面推数据,这并不影响删除队列首部的结点,因为每次推数据都往stack1里面放,而当stack2不为空的时候从stack2中流行数据,二者并不影响;

程序如下:

# include  & lt; iostream>   # include  & lt; vector>   using  namespace 性传播疾病;      template  & lt; class  T>   class 队列   {   私人:   ,,,vector, _stack1;,,,,,,,,,//定义队列的成员变量直接使用库类向量   ,,,vector, _stack2;   ,,,,   公众:   ,,,队列(),,,,,,,,//直接用类的默认构造函数,这里会自动调用向量中库的构造函数创建两个栈   ,,,{},,      ,,,//当需要向队列尾部放数据的时候,直接在栈1中推数据就可以了   ,,,void  appendTail (T 数据)   ,,,{,,   ,,,,,,,_stack1.push_back(数据);   ,,,},,,      ,,,//当要删除队列头部的数据的时候   ,,,void  deleteHead ()   ,,,{,,   ,,,,,,,//先要判断栈2中是否有数据,如果有就直接取出栈顶的元素,此时就为队首的数据   ,,,,,,,如果(! _stack2.empty ())   ,,,,,,,{   ,,,,,,,,,,,_stack2.pop_back ();   ,,,,,,,}   ,,,,,,,//若其他栈2为空,则需要将栈中1的数据调换到栈2中,以保证先进栈1的数据放在栈2的顶部   ,,,,,,,{   ,,,,,,,,,,,,(! _stack1.empty ())   ,,,,,,,,,,,{   ,,,,,,,,,,,,,,,_stack2.push_back (_stack1.back ());   ,,,,,,,,,,,,,,,_stack1.pop_back ();   ,,,,,,,,,,,}   ,,,,,,,,,,,如果(! _stack2.empty ())   ,,,,,,,,,,,,,,,_stack2.pop_back ();   ,,,,,,,,,,,   ,,,,,,,,,,,{   ,,,,,,,,,,,,,,,cout<& lt;“从而queue  is 空…”& lt; & lt; endl;   ,,,,,,,,,,,,,,,返回;   ,,,,,,,,,,,},,,   ,,,,,,,}   ,,,,,,,cout<& lt;从而new  head  is “& lt; & lt; _stack2.back () & lt; & lt; endl;   ,,,}   ,,,,   ,//为了观察方便,这里定义一个打印队列的函数,这个函数其实也就是在完成两个栈实现队列的过程,,,   ,,,void  print_queue ()   ,,,{   ,,,//这里要注意的是不能直接使用对象的成员变量stack1和stack2,因为这样会更改对象的数据,而   ,,,//我们只是需要打印数据并不希望更改它,因此可以使用向量库中的拷贝构造函数再构造出   ,,,//两个临时栈   ,,,,,,,vector, tmp1 (_stack1);   ,,,,,,,vector, tmp2 (_stack2);      ,,,,,,,cout<& lt;“head ”;   ,,,,,,,如果(tmp2.empty())//当栈2为空的时候需要将栈1的数据挪到栈2再取出   ,,,,,,,{   ,,,,,,,,,,,,(! tmp1.empty ())   ,,,,,,,,,,,{   ,,,,,,,,,,,,,,,tmp2.push_back (tmp1.back ());   ,,,,,,,,,,,,,,,tmp1.pop_back ();   ,,,,,,,,,,,}   ,,,,,,,,,,,,(! tmp2.empty ())   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

用两个栈实现一个队列——7