小白算法积累——队列和栈3#栈与队列的转化

题目:利用两个栈s1,s2,来模拟一个队列,已知栈的4个运算定义如下:

Push(S,x);//元素x入栈
Pop(S,x);//S出栈并将出栈的值赋给x
StackEmpty(S);//判断栈是否为空
StackOverflow(S);//判断栈是否满

如何利用栈的运算来实现该队列的3个运算(形参由读者根据要求自己设计)
|

Enqueue;//将元素x入队
Dequeue;//出队,并将出队元素存储在x中
QueueEmpty;//判断队列是否为空

关键字:栈和队列的转化

思路
利用两个栈S1和S2,来模拟一个队列。
当需要向队列中插入一个元素时,用S1来存放已输入的元素,即S1执行入栈操作。
当需要出队时,则将S1的元素出栈,然后再入栈S2。由于从栈中取出元素的顺序是原顺序的逆序,所以必须先将S1中的所有元素全部出栈并入栈到S2中,再在S2栈中执行出栈操作,即可实现原序的出队操作,而在执行此操作前必须判断S2是否为空,否则会导致顺序混乱。

当栈S1和S2都为空时,队列为空

总结如下:
1)对S2的出栈操作用做出队,若S2为空,则先将S1中的所有元素送入S2
2)对S1的入栈操作用做入队,若S1为满,必须先保证S2为空,才能将S1中的元素全部插入队

入队算法:

int EnQueue(Stack &S1,Stack&S2,ElemType e){
    if(!StackOverflow(S1))
       Push(S1,e);
       return 1;
    }
    if(StackOverflow(S1)&&!StackEmpty(S2)){
       printf("队列满")
       return 0;
    }
    if(StackOverflow(S1)&&StackEmpty(S2)){
       while(!StackEmpty(S1)){
          Pop(S1,&x);
          Push(S2,x);
      }
      Push(S1,e);
      return 1;
  }
 

2)出队算法:

void DeQueue(Stack&S1,Stack &S2,ElemType &x){
     if(!StackEmpty(S2)){
         Pop(S2,&x);
     }
     else if(StackEmpty(S1)){
         printf("队列为空");
     }
     else{
        while(!StackEmpty(S1)){
             Pop(S1,x);
             Push(S2,x);
        }
    Pop(S2,x);
    }
}
        
     

3)判断队列为空的算法:

int QueueEmpty(Stack S1,Stack S2){
    if(StackEmpty(S1)&&StackEmpty(S2))
       return 1;
    else
       return 0; 
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值