当前位置: 首页 > article >正文

用两个队列实现栈

目录

一、队列的基本结构及其接口

二、我的栈的结构

三、 我的栈的创建及其初始化

四、我的栈的入栈

五、我的栈出栈

六、我的栈取栈顶元素

 七、我的栈判空

八、我的栈销毁 


一、队列的基本结构及其接口

typedef int QDataType;

//队列的结构定义
typedef struct QueueNode{
    QDataType val;
    struct QueueNode *next;
}QNode;

//用结构体管理队列
typedef struct Queue{
    QNode* phead;
    QNode* ptail;
    int size;
}Queue;

//队列的初始化
void QueueInit(Queue* pq)
{
    pq->phead=NULL;
    pq->ptail=NULL;
    pq->size=0;
}

//入队
void QueuePush(Queue *pq,QDataType x)
{
    assert(pq);
    QNode *newnode=(QNode*)malloc(sizeof(QNode));
    if(newnode==NULL)
    {
        perror("malloc fail");
        exit(-1);
    }
    newnode->val=x;
    newnode->next=NULL;
    if(pq->phead==NULL)//队列为空
        pq->phead=pq->ptail=newnode;
    else
    {
        pq->ptail->next=newnode;
        pq->ptail=newnode;
    }
    pq->size++;
}

//出队
void QueuePop(Queue* pq)
{
    assert(pq);
    assert(pq->phead);//空队列

    if(pq->phead==pq->ptail)
    {
        pq->ptail=NULL;
    }
    QNode* tmp=pq->phead;
    pq->phead=tmp->next;
    free(tmp);
    tmp=NULL;
    pq->size--;
}

//取队头元素
QDataType QueueFront(Queue* pq)
{
    assert(pq);
    assert(pq->phead);
    return pq->phead->val;
}

//取队尾元素
QDataType QueueBack(Queue* pq)
{
    assert(pq);
    assert(pq->ptail);
    return pq->ptail->val;
}

//判空
bool QueueEmpty(Queue *pq)
{
    assert(pq);
    return pq->phead==NULL;
}

//销毁队列
void QueueDestroy(Queue* pq)
{
    assert(pq);
    QNode *cur=pq->phead;
    while(cur)
    {
        QNode* tmp=cur;
        cur=cur->next;
        free(tmp);
        tmp=NULL;
    }
    pq->phead=pq->ptail=NULL;
    pq->size=0;
}

二、我的栈的结构

//我的栈结构
typedef struct {
    Queue q1;
    Queue q2;
} MyStack;

三、 我的栈的创建及其初始化

//我的栈的创建及其初始化
MyStack* myStackCreate() {
    MyStack *ps=(MyStack*)malloc(sizeof(MyStack));
    QueueInit(&ps->q1);
    QueueInit(&ps->q2);

    return ps;
}

四、我的栈的入栈

//我的栈入栈
void myStackPush(MyStack* obj, int x) {
    //利用假设法
    Queue *empty=&obj->q1;
    Queue *noneempty=&obj->q2;
    if(!QueueEmpty(&obj->q1))
    {
        empty=&obj->q2;
        noneempty=&obj->q1;
    }

    QueuePush(noneempty,x);
    //QueuePush(&obj->q1,x);
}

五、我的栈出栈

//我的栈出栈
int myStackPop(MyStack* obj) {
    //利用假设法
    Queue *empty=&obj->q1;
    Queue *noneempty=&obj->q2;
    if(!QueueEmpty(&obj->q1))
    {
        empty=&obj->q2;
        noneempty=&obj->q1;
    }

    while(noneempty->size>1)
    {
        QueuePush(empty,QueueFront(noneempty));
        QueuePop(noneempty);
    }
    int stackpop=QueueFront(noneempty);
    QueuePop(noneempty);
    return stackpop;
}

六、我的栈取栈顶元素

//我的栈取栈顶元素
int myStackTop(MyStack* obj) {
    Queue* empty=&obj->q1;
    Queue* noneempty=&obj->q2;
    if(!QueueEmpty(&obj->q1))
    {
        empty=&obj->q2;
        noneempty=&obj->q1;
    }
    return QueueBack(noneempty);
}

 七、我的栈判空

//我的栈判空
bool myStackEmpty(MyStack* obj) {
    return QueueEmpty(&obj->q1)&&QueueEmpty(&obj->q2);
}

八、我的栈销毁 

//我的栈销毁 
void myStackFree(MyStack* obj) {
    QueueDestroy(&obj->q1);
    QueueDestroy(&obj->q2);
    free(obj);
}

http://www.kler.cn/a/154559.html

相关文章:

  • Web导出Excel表格
  • Redis五大基本类型——String字符串命令详解(命令用法详解+思维导图详解)
  • 如何在 Ubuntu 上安装 Jellyfin 媒体服务器
  • vue内置指令和自定义指令
  • springboot实现简单的数据查询接口(无实体类)
  • AR眼镜方案_AR智能眼镜阵列/衍射光波导显示方案
  • QT 中 QProgressDialog 进度条窗口 备查
  • mazing是什么软件?为什么选择iMazing
  • 【Redis】Redis的内部设计与实现
  • vue中中的动画组件使用及如何在vue中使用animate.css
  • go学习之goroutine和channel
  • 微信小程序获取定位显示在百度地图上位置出现偏差
  • vcomp140.dll是什么意思?vcomp140.dll缺失怎么修复的五个方法
  • WT2003H MP3语音芯片方案:强大、灵活且易于集成的音频解决方案
  • 给定一组经纬度如何判断某点是否在这组经纬度的范围之内(电子围栏实现代码)
  • 关于Maxscript你了解多少?
  • ChatGpt回答人工智能发展利大于弊的辩证论述
  • 同步加载、异步加载、延迟加载、预加载的区别
  • Java数据结构之《希尔排序》题目
  • 代码随想录算法训练营第39天| 62.不同路径 63. 不同路径 II
  • 吉他初学者学习网站搭建系列(4)——如何查询和弦图
  • NacosSync 用户手册
  • 苍穹外卖——删除购物车信息
  • Java流Stream使用详解(下)
  • 【JavaSE】API(学习笔记)
  • 【Unity】Blender场景导入