用两个栈实现队列的过程

来源:互联网 发布:php foreach循环 编辑:程序博客网 时间:2024/06/09 18:18

(1)题目:用两个栈实现一个队列。

       队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和队列头部删除结点的功能。

 

template <typename T> class CQueue{  public:  CQueue(void);  ~CQueue(void);   void appendTail(const T& node);   T  deleteHead();   private:    stack<T>  stack1;    stack<T>  stack2;}

     在上述队列的声明中可以看出,一个队列包含了两个栈stack1和stack2,因此这道题的意图是要求我们操作这两个“先进后出”的栈的实现一个“先进先出”的队列CQueue.

     我们通过一个具体的例子来分析往该队列插入和删除元素的过程。首先插入一个元素a,不妨先把它插入到stack1,此时stack1中的元素有{a},stack2为空。再压入两个元素b和c,还是插入到stack1中,此时stack1中的元素有{a,b,c},其中c位于栈顶,而stack2仍然是空的(如图1.0(a)所示)。 

      

      这个时候我们试着从队列中删除一个元素。按照队列先入先出的规则,由于a比b、c先插入到队列中,最先被删除的元素应该是a。元素a存储在stack1中,但并不在栈顶上,因此不能直接进行删除。注意到stack2我们还一直没有使用过,现在是让stack2发挥作用的时候了。如果我们把stack1中的元素逐个弹出并压入stack2,元素在stack2中的顺序正好和原来在stack1中的顺序相反。因此经过3次弹出srack1和压入stack2操作之后,stack1为空,而stack2中的元素是{c,b,a},这个时候就是可以弹出stack2的栈顶a了。此时的stack1为空,而stack2的元素为{c,b},其中b在栈顶(如图1.0(b)所示)。

      如果我们还想继续删除队列的头部应该怎么办呢?剩下的两个元素是b和c,b比c早进入队列,因此b应该先删除。而此时b恰好又在栈顶上,因此直接弹出stack2的栈顶即可。这次弹出操作之后,stack1中仍然为空,而stack2为{c}(如图1.0(c)所示)。

      从上面的分析中我们可以总结出删除一个元素的步骤:当stack2中不为空时,在stack2中的栈顶元素是最先进入队列的元素,可以弹出。如果stack2为空时,我们把stack1中的元素逐个弹出并压入stack2 。由于先进入队列的元素被压到stack1的底端,经过弹出和压入之后就处于stack2的顶端了,又可以直接弹出。

     接下来再插入一个元素d。我们还是把它压入stack1(如图1.0(d)所示),这样会不会有问题呢?我们考虑下一次删除队列的头部stack2不为空,直接弹出它的栈顶元素c如图1.0(e)所示).而c的确是比d先进入队列,应该在d之前从队列中删除,因此不会出现任何矛盾。

    总结完每一次在队列的插入和删除操作的过程之后,我们就可以开始动手写代码了。

 templatr<typename T> void CQueue<T>::appendTail(const T& element){   stack1.push(element);}template<typename T> T CQueue<T>::deleteHead(){ if (stack2.size()<=0){   while(stack1.size()>0)  {  T& date=stack1.top();   stack1.pop();   stack2.push(data);  }}  if(stack2.size()==0)throw new exception("queue  is  empty");T head=stack2.top();stack2.pop();return head;}



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 酷我音乐收费怎么办 电脑版酷狗字体模糊怎么办 酷我切歌怎么办 快手暂不支持音乐格式怎么办 上传视频不清晰怎么办 MP4格式嫌大怎么办 课堂派怎么办改成考试 手机信息幕变黑怎么办 手机百度太耗电怎么办 电脑打不开主页面怎么办? 贴吧被永久封了怎么办 晒课视频太大怎么办 有道精品课过期怎么办 手机缓存变小了怎么办 优学院课程过期怎么办 上公开课紧张怎么办 光纤被老鼠咬断怎么办 石灰粉进入眼睛怎么办 幼儿误吃粉笔怎么办? 吃了粉笔应该怎么办 小孩吃了颜料怎么办 小宝宝吃了纸怎么办 孩子不认真听讲怎么办 监控手机软件离线状态怎么办 云课堂忘记密码怎么办 广州办培训机构怎么办 一师一优课账号忘了怎么办 云相册空间不足怎么办 三星云空间不足怎么办 三星储存空间不足怎么办 宁阳县教育局强制补课怎么办 沉迷网络该怎么办英语 29岁沉迷游戏怎么办 学乐云登录不上怎么办 魔方学院无法识别怎么办 路由器卫士忘记密码怎么办 邮箱号忘记密码怎么办 水卡没钱了怎么办 旅行青蛙换手机怎么办 软件尚未受信任怎么办 百度搜不到的怎么办