用队列实现栈
创始人
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 . 总结 

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

相关内容

热门资讯

技巧辅助挂!pokermast... 技巧辅助挂!pokermaster修改器,丹东约战麻将辅助器,演示教程(有挂细节)1、点击下载安装,...
现场直击!wepokerplu... 现场直击!wepokerplus万能挂,丰城双剑新版最强高分攻略,操作教程(有挂方针)1.丰城双剑新...
插件辅助挂!wepoker有辅... 插件辅助挂!wepoker有辅助器吗,乐平包王攻略,学习教程(有挂方略)1、首先打开乐平包王攻略辅助...
据玩家消息!拱趴大菠萝辅助神器... 据玩家消息!拱趴大菠萝辅助神器,多乐跑得快辅助器,机巧教程(证实有挂)1、在拱趴大菠萝辅助神器插件功...
此事备受玩家关注!来玩app破... 此事备受玩家关注!来玩app破解版,h5能反杀吗,绝活教程(有挂详细)1、打开软件启动之后找到中间准...
值得注意的是!aapoker破... 值得注意的是!aapoker破解侠是真的吗,蜀山四川游戏修改工具,经验教程(有挂助手)1、金币登录送...
第三方辅助!wepoker脚本... 第三方辅助!wepoker脚本,广东星悦有外开挂辅助器吗,法门教程(有挂分析)广东星悦有外开挂辅助器...
此事引发广泛关注!德州透视脚本... 此事引发广泛关注!德州透视脚本,崇阳斗棋辅助脚本视频,诀窍教程(的确有挂)暗藏猫腻,小编详细说明崇阳...
黑科技辅助挂!wepoker买... 黑科技辅助挂!wepoker买脚本靠谱吗,情怀七喜游戏辅助,法门教程(有挂方法)1、每一步都需要思考...
方法辅助挂!aapoker怎么... 方法辅助挂!aapoker怎么设置提高好牌几率,蘑菇云辅助使用视频,绝活儿教程(讲解有挂)1、完成蘑...