用队列实现栈
创始人
2024-11-03 17:37:20
0

 

1 .思路及目的

 用两个标准的队列(先进先出)实现栈(后进先出)

始终保持一个队列为空,往非空的栈插入数据

删除数据时,将数据导入另一个队列,留下最后一个数据(这个数据就是要删除的数据)

并实现多个接口:

push(插入数据)

top(返回栈顶元素)

pop(删除数据)

empty(判空)

栈结构图示 :q1和q2为队列,obj是构成的栈

 

栈基本接口: 

typedef int QDataType;

// 链式结构:表示队列

typedef struct QListNode

{

    struct QListNode* _next;

    QDataType _data;

}QNode;

// 队列的结构

typedef struct Queue

{

    QNode* _front;

    QNode* _rear;

    int size;

}Queue;

// 初始化队列

void QueueInit(Queue* q);

// 队尾入队列

void QueuePush(Queue* q, QDataType data);

// 队头出队列

void QueuePop(Queue* q);

// 获取队列头部元素

QDataType QueueFront(Queue* q);

// 获取队列队尾元素

QDataType QueueBack(Queue* q);

// 获取队列中有效元素个数

int QueueSize(Queue* q);

// 检测队列是否为空,如果为空返回非零结果,如果非空返回0

int QueueEmpty(Queue* q);

// 销毁队列

void QueueDestroy(Queue* q);

1.1 栈初始化

MyStack* myStackCreate() {

    MyStack* pst = (MyStack*)malloc(sizeof(MyStack));

    QueueInit(&(pst->q1));

    QueueInit(&(pst->q2));

    return pst;

}

 1.2 插入数据

使用两个栈实现队列,往非空的栈插入数据,若两个栈都为空,往任意一个栈插入数据即可

void myStackPush(MyStack* obj, int x) {

    if(!QueueEmpty(&(obj->q1)))

    {

        QueuePush(&(obj->q1), x);

    }

    else

    {

        QueuePush(&(obj->q2), x);

    }

}

1.3 删除数据 

删除数据时,需要将队列内的数据导入另一个队列,留下最后一个数据,这个数据就是要删除的数据

图解: 

 

int myStackPop(MyStack* obj) {

    Queue* empty = &(obj->q1);

    Queue* nonEmpty = &(obj->q2);

    if(!QueueEmpty(&(obj->q1)))

    {

        nonEmpty = &(obj->q1);

        empty = &(obj->q2);

    }

    while(QueueSize(nonEmpty) > 1)

    {

        QueuePush(empty, QueueFront(nonEmpty));

        QueuePop(nonEmpty);

    }

    int top = QueueFront(nonEmpty);

    QueuePop(nonEmpty);

    return top;

}

1.4  获取栈顶元素

即获取非空队列的尾部元素

int myStackTop(MyStack* obj) {

    if(!QueueEmpty(&(obj->q1)))

    {

        return QueueBack(&(obj->q1));

    }

    else{

        return QueueBack(&(obj->q2));

    }

}

1.5 栈的判空 

两个队列都为空,栈才为空

bool myStackEmpty(MyStack* obj) {

    return QueueEmpty(&(obj->q1)) && QueueEmpty(&(obj->q2));

1.6 栈的销毁 

分别销毁两个队列,最后再销毁栈

void myStackFree(MyStack* obj) {

    QueueDestroy(&(obj->q1));

    QueueDestroy(&(obj->q2));

    free(obj);

}

2 . 总结 

利用两个队列实现栈的关键,在于数据的删除、插入时如何处理 

相关内容

热门资讯

透视教程!wepoker买钻石... 透视教程!wepoker买钻石有用吗,wepoker有辅助插件吗(本来是真的有挂)暗藏猫腻,小编详细...
透视好友!pokemmo辅助器... 透视好友!pokemmo辅助器手机版下载,pokemmo脚本最新版,必赢教程(有挂细节);1、让任何...
透视好友!aapoker万能辅... 透视好友!aapoker万能辅助器,aapoker发牌逻辑,2025版教程(有挂细节)1、让任何用户...
透视辅助!hhpoker德州有... 透视辅助!hhpoker德州有挂吗,德州局hhpoker,插件教程(有挂黑科技);hhpoker德州...
透视辅助!wepokerplu... 透视辅助!wepokerplus开挂,wepoker智能辅助插件(确实有挂)1、wepoker智能辅...
透视免费!红龙poker辅助器... 透视免费!红龙poker辅助器免费观看,pokemmo辅助器手机版下载,安装教程(有挂介绍);1、进...
透视线上!aapoker公共底... 透视线上!aapoker公共底牌,aapoker辅助器是真的吗,介绍教程(有挂细节)进入游戏-大厅左...
透视科技!hhpoker真的假... 透视科技!hhpoker真的假的,hhpoker透视脚本视频,必备教程(有挂攻略);1、上手简单,内...
透视计算!wepoker有透视... 透视计算!wepoker有透视吗,wepoker私人局俱乐部怎么进(一贯是真的有挂)1、每一步都需要...
透视辅助!智星德州插件怎么下载... 透视辅助!智星德州插件怎么下载,pokemmo脚本辅助,靠谱教程(有挂揭秘)进入游戏-大厅左侧-新手...