利用两个队列模仿队列

已知栈的4个运算定义如下:

Push(S,x)    //元素x入栈

Pop(S,x)     //S出栈并将出栈的元素赋值给x

StackEmpty(S)  //判断S是否为空

StackOverflow(S)  //S是否满


用以上的运算实现以下3个运算:进队列,出队列,判空。

算法思想:利用两个栈s1和s2来模拟队列,当需要向队列中插入元素时,用s1来存放已输入的元素,即s1执行入栈。

                   当需要出栈时,则对s2执行出栈操作。由于从栈中取元素的顺序是原顺序的逆序,所以,要先将s1里元素                    全部出栈并压入s2中,再从s2中取元素,实现出队列操作。而在执行此操作前,必须先判断s2是否为                          空,否则会使顺序混乱。当s1和s2都为空时,队列为空。

入队列算法:

int EnQueue(Stack s1,Stack s2,ElemType e){

    if(!StackOverflow(s1)){                                 //若s1未满。则直接入栈

        Push(s1,e);

        return 1;  

    }

   if(StackOverflow(s1)&&StackOverflow(s2)){   //若s1和s2都满,则说明队列满

       printf("队列满");

       return 0;

   }

   if(StackOverflow(s1)&&!StackOverflow(s2)){    // 若s1满而s2未满,则先将s1中的元素压入s2,再将x入s1

       while(!StackOverflow(s1)){

                Pop(s1,x);

                Push(s1,x);

       }

       Push(s1,e);

       return 1;

   }

}




出队列算法:

void DeQueue(Stack s1,Stack s2,ElemType x){    //若s2不为空,则直接取出元素

     if(!StackOverflow(s2)){

         Pop(s2,x);

     }

     else if(StackOverflow(s1)){  //r若s2和s1都空,则队列为空

          printf("队列空");

     }

     else{

         while(!StackOverflow(s1)){  //若s2空,而s1不为空,则先将s1的元素全部压入s2,在从s2取元素。

                  Pop(s1,x);

                  Push(s2,x);

          }  

          Pop(s2,x);

     }

}




判空算法:


int  QueueEmpty(Stack s1,Stack s2){

      if(StackOverflow(s1)&&StackOverflow(s2))

      return 1;

      else return 0;

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值