LeetCode - 232.用栈实现队列 225.用队列模拟实现栈 (C语言,配图)

目录

232.用栈实现队列

225.用队列模拟实现栈  


    注:本文是基于C语言实现的代码,所以栈和队列是在力扣上制造实现的,如果你使用C++等语言,可以忽略前面相当大部分的代码。

    在栈模拟实现栈和队列之前,我们先来复习一下栈和队列的定义,你必须对栈和队列有详细的了解,并模拟实现过,否则,一下实现对你的理解可能较为困难。

        栈:只允许一端(栈顶)进行插入和删除操作。

        队列:只允许一端进行插入,令一端进行删除操作。

数据结构入门————栈和队列(C语言/零基础/小白/新手+模拟实现+例题讲解)-CSDN博客

232.用栈实现队列

232. 用栈实现队列 - 力扣(LeetCode)

        对于队列,我们使用链式结构,进行尾插和头插,如果我们只使用一个栈来说,这是非常困难的,那我们就转变一下思路,使用两个栈来实现。这里我们叫一个为emptys(空栈),另一个叫nonemptys(非空栈)

        当我们想要插入时直接尾插到nonemptys(如果是第一次插入,无所谓emptys,nonemptys)。

        想要删除时,就将nonemptys栈的第二个及以后的数据插入到emptys中,然后将nonemptys中第一个数据删除,最后再将emptysz栈数据导入nonemptys中。

        

注:因为C语言,并没有对顺序栈的实现,所以我们要自己定义一个顺序栈结构。


typedef int STDataType;typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;//初始化
void StackInit(ST* pst)
{assert(pst);pst->a = NULL;pst->top = 0;pst->capacity = 0;
}//销毁
void StackDestroy(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->top = 0;pst->capacity = 0;
}//插入
void StackPush(ST* pst, STDataType x)
{assert(pst);if (pst->top == pst->capacity){int newcapacity = (pst->capacity == 0) ? 4 : pst->capacity * 2;STDataType* temp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newcapacity);if (temp == NULL){perror("realloc");return;}pst->a = temp;pst->capacity = newcapacity;}pst->a[pst->top] = x;pst->top++;
}//删除
void StackPop(ST* pst)
{assert(pst);assert(pst->top > 0);pst->top--;
}//返回top值
STDataType StackTop(ST* pst)
{assert(pst);assert(pst->top > 0);return pst->a[pst->top - 1];
}//判断是否为空
bool StackEmpty(ST* pst)
{assert(pst);return pst->top == 0;
}//元素个数
int StackSize(ST* pst)
{assert(pst);return pst->top;
}typedef struct {ST st1;ST st2;
} MyQueue;MyQueue* myQueueCreate() {MyQueue* pq = (MyQueue*)malloc(sizeof(MyQueue));if (pq == NULL){perror("malloc");return NULL;}StackInit(&pq->st1);StackInit(&pq->st2);return pq;
}void myQueuePush(MyQueue* obj, int x) {if (!StackEmpty(&obj->st1)){StackPush(&obj->st1, x);}else{StackPush(&obj->st2, x);}
}int myQueuePop(MyQueue* obj) {ST* emptys = &obj->st1;ST* nonemptys = &obj->st2;if (!StackEmpty(&obj->st1)){emptys = &obj->st2;nonemptys = &obj->st1;}while (StackSize(nonemptys) > 1){StackPush(emptys, StackTop(nonemptys));StackPop(nonemptys);}int first = StackTop(nonemptys);StackPop(nonemptys);while (StackSize(emptys) > 0){StackPush(nonemptys, StackTop(emptys));StackPop(emptys);}return first;
}int myQueuePeek(MyQueue* obj) {ST* emptys = &obj->st1;ST* nonemptys = &obj->st2;if (!StackEmpty(&obj->st1)){emptys = &obj->st2;nonemptys = &obj->st1;}while (StackSize(nonemptys) > 1){StackPush(emptys, StackTop(nonemptys));StackPop(nonemptys);}int first = StackTop(nonemptys);StackPush(emptys, StackTop(nonemptys));StackPop(nonemptys);while (StackSize(emptys) > 0){StackPush(nonemptys, StackTop(emptys));StackPop(emptys);}return first;
}bool myQueueEmpty(MyQueue* obj) {return StackEmpty(&obj->st1) && StackEmpty(&obj->st2);
}void myQueueFree(MyQueue* obj) {StackDestroy(&obj->st1);StackDestroy(&obj->st2);free(obj);
}

225.用队列模拟实现栈  

225. 用队列实现栈 - 力扣(LeetCode)

        对于队列,我们也可以使用同样的思路,使用两个栈将数据来回导入导出,来实现队列的一端进行插入,另一端进行删除操作的定义。这里我们叫一个为emptyq(空队列),另一个叫nonemptys(非空队列)

        当我们想要插入时直接尾插到nonemptyq(如果是第一次插入,无所谓emptyq,nonemptyq)。

        当我们想要删除时,将nonemptyq中第二个及以上的数据导入emptyq中,再将nonemptyq中的第一个数据删除。

注:因为C语言,并没有对链式队列的实现,所以我们要自己定义一个链式队列。

typedef int QNDataType;typedef struct QueueNode
{QNDataType data;struct QueueNode* next;
}QNode;typedef struct Queue
{QNode* phead;QNode* ptail;int size;
}Queue;//初始化
void QueueInit(Queue* pq)
{assert(pq);pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}//插入
void QueuePush(Queue* pq, QNDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("mallloc");return;}newnode->data = x;newnode->next = NULL;if (pq->ptail == NULL){pq->ptail = pq->phead = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}//删除
void QueuePop(Queue* pq)
{assert(pq);assert(pq->phead);if (pq->phead->next == NULL){pq->phead = pq->phead->next;pq->ptail = NULL;}else{QNode* del = pq->phead;pq->phead = pq->phead->next;free(del);del = NULL;}pq->size--;
}//获取头部元素
QNDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->phead);return pq->phead->data;
}//获取尾部元素
QNDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->phead);return pq->ptail->data;
}//元素个数
int QueueSize(Queue* pq)
{assert(pq);QNode* cur = pq->phead;int size = 0;while (cur != NULL){size++;cur = cur->next;}return size;
}//判断是否为空 
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->phead == NULL;
}//销毁
void QueueDestroy(Queue* pq)
{assert(pq);while(!QueueEmpty(pq)){QueuePop(pq);}pq->size = 0;
}
typedef struct {Queue q1;Queue q2;
} MyStack;MyStack* myStackCreate() {MyStack* pst = (MyStack*)malloc(sizeof(MyStack));QueueInit(&pst->q1);QueueInit(&pst->q2);return pst;
}void myStackPush(MyStack* obj, int x) {if(!QueueEmpty(&obj->q1)){QueuePush(&obj->q1,x);}else{QueuePush(&obj->q2,x);}
}int myStackPop(MyStack* obj) {Queue* empty = &obj->q1;Queue* nonempty = &obj->q2;if(!QueueEmpty(&obj->q1)){empty = &obj->q2;nonempty = &obj->q1;}while(QueueSize(nonempty) > 1){QueuePush(empty,QueueFront(nonempty));QueuePop(nonempty);}int top = QueueFront(nonempty);QueuePop(nonempty);return top;
}int myStackTop(MyStack* obj) {if(!QueueEmpty(&obj->q1)){return obj->q1.ptail->data;}else{return obj->q2.ptail->data;}
}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.hqwc.cn/news/176977.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年数维杯国际大学生数学建模挑战赛

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。 cs数模团队在数维杯前为大家提供了许多资料的内容呀&#xff0…

基于SSM的宠物综合服务平台的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

TikTok:传承文化多样性,扬播全球声音

在数字时代,社交媒体平台已经成为了传播文化多样性和全球声音的重要渠道。其中,TikTok无疑是最引人注目的之一。 这个短视频应用在短短几年内迅速崭露头角,吸引了全球数亿用户,成为一个独特的文化传媒工具,通过短视频…

不使用宝塔面板 安装 EasyImage 简单图床

发布于 2023-07-17 在 https://chenhaotian.top/linux-app/easy-image/ 前言 如果不希望安装宝塔面板或其国际版 aapanel(尽管宝塔面板可以在安装后关闭),那么可以参考这篇文章。 本文安装环境为 Debian 11, 在 Ubuntu 20.04 测试通过 安…

京东API商品详情接口丨关键词搜索接口丨优惠券接口丨京东店铺所有商品接口

京东API商品详情接口,关键词搜索接口,优惠券接口,京东店铺所有商品接口如下: item_get-获得JD商品详情 公共参数 请求地址: https://o0b.cn/anzexi 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中&…

C/C++ stm32基础知识超详细讲解(系统性学习day14)

目录 前言 一、ARM和STM32是什么? 二、STM32的开发方式 三、GPIO----寄存器开发方式 1.八种输入输出模式分析 2.寄存器 四、stm32芯片图片 五、怎么学好stm32 总结 前言 stm32的广泛含义及背景: STM32是一款由意法半导体(ST&…

机器学习基础之《回归与聚类算法(7)—无监督学习K-means算法》

一、什么是无监督学习 1、没有目标值—无监督学习 一家广告平台需要根据相似的人口学特征和购买习惯将美国人口分成不同的小组,以便不同的用户采取不同的营销策略。 Airbnb需要将自己的房屋清单分组成不同的社区,以便用户能更轻松地查阅这些清单&#x…

【PyTorch教程】如何使用PyTorch分布式并行模块DistributedDataParallel(DDP)进行多卡训练

本期目录 1. 导入核心库2. 初始化分布式进程组3. 包装模型4. 分发输入数据5. 保存模型参数6. 运行分布式训练7. DDP完整训练代码 本章的重点是学习如何使用 PyTorch 中的 Distributed Data Parallel (DDP) 库进行高效的分布式并行训练。以提高模型的训练速度。 1. 导入核心库 D…

基于SSM的OA办公管理系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

Oracle数据库、实例、用户、表空间和表之间的关系

一、Oracle数据库中数据库、实例、用户、表空间和表(索引、视图、存储过程、函数、对象等对象)之间的关系。 1、Oracle的数据库是由一些物理文件组成:数据文件控制文件重做日志文件归档日志文件参数文件报警和跟踪日志文件备份文件。 2、实…

MHA:故障切换

MHA: masterhight availabulity:基于主库的高可用环境下:主从复制 故障切换 主从的架构。 MHA:最少要一主两从 mysql的单点故障问题,一旦主库崩溃,MHA可以在0-30秒内自动完成故障切换。 工作原理&#…

上机实验四 图的最小生成树算法设计 西安石油大学数据结构

实验名称:图的最小生成树算法设计 (1)实验目的: 掌握最小生成树算法,利用kruskal算法求解最小生成树。 (2)主要内容: 利用kruskal算法求一个图的最小生成树,设计Krus…