栈与队列---用两个栈实现队列

使用两个栈实现先入先出队列,要求完成队列的插入删除获取队首队尾元素等操作。、

方法一

队列结构

typedef struct {
    AS stackpush;
    AS stackpop;
} MyQueue;

初始化

MyQueue* myQueueCreate() {
    MyQueue* mq = (MyQueue*)malloc(sizeof(MyQueue));
    if(mq == NULL)
    {
        perror("malloc fail");
        exit(-1);
    }
    AStackInit(&mq->stackpush);
    AStackInit(&mq->stackpop);
    return mq;
}

入队

入队,把元素插入stackpush栈即可。

void myQueuePush(MyQueue* obj, int x) {
    AStackPush(&obj->stackpush , x);
}

获取队头元素

如果stackpop栈有数据,那么直接获取栈顶数据即为队头元素;若没有数据,将stackpush栈中所有数据从栈顶依次倒入stackpop栈,然后获取栈顶数据。所以可以用于出队的简便实现。

int myQueuePeek(MyQueue* obj) {
    if(AStackEmpty(&obj->stackpop))
    {    
        while(!AStackEmpty(&obj->stackpush))
        {
            AStackPush(&obj->stackpop , AStackTop(&obj->stackpush));
            AStackPop(&obj->stackpush);
        }
    }
    int tmp = AStackTop(&obj->stackpop);
    return tmp;
}

出队

在获取队头元素的基础上,将stackpop栈栈顶数据进行删除即可。

int myQueuePop(MyQueue* obj) {
    int tmp = myQueuePeek(obj);
    AStackPop(&obj->stackpop);
    return tmp;
}

判断队列是否为空

bool myQueueEmpty(MyQueue* obj) {
    return AStackEmpty(&obj->stackpush) && AStackEmpty(&obj->stackpop);
}

释放空间

void myQueueFree(MyQueue* obj) {
    AStackDestroy(&obj->stackpush);
    AStackDestroy(&obj->stackpop);
    free(obj);
    obj=NULL;
}

方法二

队列结构

typedef struct {
    AS stack1;
    AS stack2;
} MyQueue;

初始化

MyQueue* myQueueCreate() {
    MyQueue* mq = (MyQueue*)malloc(sizeof(MyQueue));
    if(mq == NULL)
    {
        perror("malloc fail");
        exit(-1);
    }
    AStackInit(&mq->stack1);
    AStackInit(&mq->stack2);
    return mq;
}

入队

非空栈执行入队操作。

void myQueuePush(MyQueue* obj, int x) {
    if(!AStackEmpty(&obj->stack1))
        AStackPush(&obj->stack1,x);
    else
        AStackPush(&obj->stack2,x);
}

获取队头元素

使用假设判断法,将非空栈中前N-1个数据倒入空栈,然后获取最后栈顶数据,再将空栈中倒入数据倒回来。 

int myQueuePeek(MyQueue* obj) {
    AS* emptys = &obj->stack1;
    AS* nonemptys = &obj->stack2;
    if(AStackEmpty(&obj->stack2))
    {
        nonemptys = &obj->stack1;
        emptys = &obj->stack2;
    }
    while(AStackSize(nonemptys)>1)
    {
        AStackPush(emptys , AStackTop(nonemptys));
        AStackPop(nonemptys);
    }
    int tmp = AStackTop(nonemptys);
    while(!AStackEmpty(emptys))
    {
        AStackPush(nonemptys , AStackTop(emptys));
        AStackPop(emptys);
    }
    return tmp;
}

出队

比获取队头元素多一些步骤,将非空栈N-1个数据倒入空栈后,获取原非空栈栈顶数据后删除,然后将空栈中倒入的数据倒回到非空栈。

int myQueuePop(MyQueue* obj) {
    AS* emptys = &obj->stack1;
    AS* nonemptys = &obj->stack2;
    if(AStackEmpty(&obj->stack2))
    {
        nonemptys = &obj->stack1;
        emptys = &obj->stack2;
    }
    while(AStackSize(nonemptys)>1)
    {
        AStackPush(emptys , AStackTop(nonemptys));
        AStackPop(nonemptys);
    }
    int tmp = AStackTop(nonemptys);
    AStackPop(nonemptys);
    while(!AStackEmpty(emptys))
    {
        AStackPush(nonemptys , AStackTop(emptys));
        AStackPop(emptys);
    }
    return tmp;
}

判断队列是否为空

bool myQueueEmpty(MyQueue* obj) {
    return AStackEmpty(&obj->stack1) && AStackEmpty(&obj->stack2);
}

释放空间

void myQueueFree(MyQueue* obj) {
    AStackDestroy(&obj->stack1);
    AStackDestroy(&obj->stack2);
    free(obj);
    obj=NULL;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值