利用队列去实现栈

利用队列实现栈

今天我们利用两个队列去实现栈(因为是用c去实现队列没有c++中的库函数所以我们要先手搓一个队列再去使用)

需要队列代码的看我的这篇文章:队列的实现-CSDN博客

全部代码展示需要的自取:

typedef struct {
    Queue p1;
    Queue p2;
} MyStack;


MyStack* myStackCreate() {
    MyStack*obj=(MyStack*)malloc(sizeof(MyStack));

    QueueInit(&obj->p1);
    QueueInit(&obj->p2);
}

void myStackPush(MyStack* obj, int x) {
    if(!QueueEmpty(&obj->p1))
    {
        QueuePush(&obj->p2,x);
    }
    else
    {
        QueuePush(&obj->p1,x);
    }
}
int myStackPop(MyStack* obj) {
    Queue*empty=&obj->p1;
    Queue*nonempty=&obj->p2;
    if(!QueueEmpty(&obj->p1))
    {
        empty=&obj->p2;
        nonempty=&obj->p1;
    }

    while(!QueueEmpty(nonempty)>1)
    {
      QueuePush(empty,QueueFront(nonempty));
      QueuePop(nonempty);
    }
    int top=QueueFront(nonempty);
    return top;
}

int myStackTop(MyStack* obj) {
   if(!QueueEmpty(&obj->p1))
   {
    return QueueBack(&obj->p1);
   }else
   {
    return QueueBack(&obj->p2);
   }
}

bool myStackEmpty(MyStack* obj) {
    return QueueEmpty(&obj->p1)&&QueueEmpty(&obj->p2);
}

void myStackFree(MyStack* obj) {
    QueueDestroy(&obj->p1);
    QueueDestroy(&obj->p2);

    free(obj);
}

整体思路

因为队列特性是先进先出,利用两个队列一个先存储数据然后与另一个进行交换,只留最后插进来的数据然后弹出最后的数据即可。

分步完成

定义队列

思路解析:

                利用结构体对队列进行管理

代码展示:

typedef struct {
    Queue p1;
    Queue p2;
} MyStack;

初始化队列

思路解析:

                因为obj是局部变量所以我们要利用malloc函数在堆上面开空间

代码展示:

MyStack* myStackCreate() {
    MyStack*obj=(MyStack*)malloc(sizeof(MyStack));

    QueueInit(&obj->p1);
    QueueInit(&obj->p2);
}

插入数据

思路解析:

                利用empty函数对队列进行判断如果为空就把数据尾插进去。

代码展示:

void myStackPush(MyStack* obj, int x) {
    if(!QueueEmpty(&obj->p1))
    {
        QueuePush(&obj->p2,x);
    }
    else
    {
        QueuePush(&obj->p1,x);
    }
}

删除并返回栈顶元素

思路解析:

                利用while函数进行交换然后返回最后一个数据即可。

代码展示:

int myStackPop(MyStack* obj) {
    Queue*empty=&obj->p1;
    Queue*nonempty=&obj->p2;
    if(!QueueEmpty(&obj->p1))
    {
        empty=&obj->p2;
        nonempty=&obj->p1;
    }

    while(!QueueEmpty(nonempty)>1)
    {
      QueuePush(empty,QueueFront(nonempty));
      QueuePop(nonempty);
    }
    int top=QueueFront(nonempty);
    return top;
}

返回栈顶元素

思路解析:

                利用手搓的back函数对数据进行返回即可。

代码展示:

int myStackTop(MyStack* obj) {
   if(!QueueEmpty(&obj->p1))
   {
    return QueueBack(&obj->p1);
   }else
   {
    return QueueBack(&obj->p2);
   }
}

对栈进行判断

思路解析:

                直接使用bool函数对代码进行判断

代码展示:

bool myStackEmpty(MyStack* obj) {
    return QueueEmpty(&obj->p1)&&QueueEmpty(&obj->p2);
}

销毁程序

思路解析:

                先对定义的队列进行销毁然后把这个结构体给free即可。

代码展示:

void myStackFree(MyStack* obj) {
    QueueDestroy(&obj->p1);
    QueueDestroy(&obj->p2);

    free(obj);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值