【栈】利用两个栈模拟队列

利用两个栈模拟队列

题目描述:

利用两个栈S1、S2来模拟一个队列,已知栈的4种定义如下:

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

利用栈实现3个运算

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

算法思想:

利用两个栈S1和S2来模拟一个队列,当需要向队列中插入一个元素时,用S1来存放已输入的元素,即S1执行入栈操作。

当需要出队时,则对S2执行出栈操作。

由于从栈中取出元素的顺序是原顺序的逆序,所以必须先将S1中的所有元素全部出栈并入栈到S2中,再在S2中执行出栈操作,即可实现出队操作,而执行操作前必须判断S2是否为空,否则会导致顺序混乱。

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

入队操作

1. 两个栈S1,S2都为空,执行入队操作,将元素直接插入S1中。

2. 栈S1为满,栈S2不为空,则队列为满,无法执行入队操作。

 3. 栈S1为满,栈S2为空,执行入队操作,先将栈S1中的元素逐一出栈,再逐一入栈S2;

     当S1为空时,将元素插入S1中,实现入队操作。

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

出队操作

1. 栈S2不为空,则队首元素位于S2的栈顶(栈S1为满,S2不为空),执行出队操作,将S2中的栈顶元素出栈,实现出队操作。

2. 栈S2为空,栈S1为空,则队列为空,无法实现出队操作。

3.  栈S1不空,栈S2为空,执行出队操作时,先将S1中元素逐一从S1出栈,再逐一入栈S2,最后将S2中的栈顶元素出栈,实现出队操作。

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);
        }    //while
       Pop(S2,x);
    }    //else
}

判空操作

两个栈S1和S2都为空时,队列为空。

int QueueEmpty(Stack S1,Stack S2)
{
    if(StackEmpty(S1)&&StackEmpty(S2))
        return 1;
    else
        return 0;
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值