StackOrQueueOJ3:用栈实现队列

ops/2025/1/22 16:17:48/

目录

  • 题目描述
  • 思路分析
    • 开辟队列
    • 入队列
    • 出队列
  • 代码展示


题目描述

原题:232. 用栈实现队列

在这里插入图片描述
在这里插入图片描述

思路分析

有了前面的用队列实现栈的基础我们不难想到这题的基本思路,也就是用两个栈来实现队列,(栈的实现具体参考:栈及其接口的实现)

typedef struct {Stack PushSt;Stack PopSt;
} MyQueue;

PushSt用来插入数据
PopSt用来出数据

入队列那直接对PushSt进行入栈即可;

那也就我们只要进行出队列或去对头元素我们就需要将PushSt栈中的元素依次入栈到PopSt中,我们就可以就这个功能写一个专用的接口:

void PushStToPopSt(MyQueue* obj)
{if (StackEmpty(&obj->PopSt)){while(!StackEmpty(&obj->PushSt)){StackPush(&obj->PopSt,StackTop(&obj->PushSt));StackPop(&obj->PushSt);}}
}

这样实现这题就不难了:

开辟队列

如果这里用MyQueue q来创建队列,由于在函数内是个局部变量,所以会创建失败;

MyQueue* myQueueCreate() {MyQueue* q = (MyQueue*)malloc(sizeof(MyQueue));if(q == NULL){perror("malloc");exit(-1);}StackInit(&q->PushSt);StackInit(&q->PopSt);return q;
}

入队列

根据上面的分析,很容易写出:

void myQueuePush(MyQueue* obj, int x) {StackPush(&obj->PushSt,x);}

出队列

同上面的分析:

int myQueuePop(MyQueue* obj) {PushStToPopSt(obj);int ret = StackTop(&obj->PopSt);StackPop(&obj->PopSt);return ret;
}

代码展示

typedef int STDataType;// 支持动态增长的栈
typedef struct Stack
{STDataType* _a;int _top;  //栈顶指针int _capacity; //动态容量
}Stack;//栈的初始化
void StackInit(Stack* pst);//栈的销毁
void StackDestory(Stack* pst);//入栈
void StackPush(Stack* pst, STDataType x);//出栈
void StackPop(Stack* pst);//获取数据的个数
int StackSize(Stack* pst);    //考虑到内存和统一性问题我们这里也传一级指针//判空,1是空,0是非空
int StackEmpty(Stack* pst);//获取栈顶数据
STDataType StackTop(Stack* pst);//栈的初始化
void StackInit(Stack* pst)
{assert(pst);//这样会给后面扩容造成麻烦/*pst->_a = NULL;pst->_top = 0;pst->_capacity = 0;*/pst->_a = (STDataType*)malloc(sizeof(STDataType) * 4);pst->_top = 0;pst->_capacity = 4;
}//栈的销毁
void StackDestory(Stack* pst)
{assert(pst);free(pst->_a); //释放开辟的空间pst->_a = NULL;pst->_top = pst->_capacity = 0;
}//入栈
void StackPush(Stack* pst, STDataType x)
{//检查是否需要扩容if (pst->_top == pst->_capacity){pst->_capacity *= 2;STDataType* tmp = (STDataType*)realloc(pst->_a, sizeof(STDataType) * pst->_capacity);if (tmp == NULL){perror("relloc");exit(-1);}else{pst->_a = tmp;}}pst->_a[pst->_top] = x;pst->_top++;
}//出栈
void StackPop(Stack* pst)
{assert(pst);assert(pst->_top > 0);//只需要将top一走,可以不用初始化出栈的值//pst->_a[pst->_top] = 0;pst->_top--;
}//获取数据的个数
int StackSize(Stack* pst)   //考虑到内存和统一性问题我们这里也传一级指针
{assert(pst);return pst->_top;
}//判空,1是空,0是非空
int StackEmpty(Stack* pst)
{assert(pst);//return pst->_top == 0 ? 1 : 0;return !pst->_top;
}//获取栈顶数据
STDataType StackTop(Stack* pst)
{assert(pst);assert(pst->_top);return pst->_a[pst->_top-1];
}typedef struct {Stack PushSt;Stack PopSt;
} MyQueue;MyQueue* myQueueCreate() {MyQueue* q = (MyQueue*)malloc(sizeof(MyQueue));if(q == NULL){perror("malloc");exit(-1);}StackInit(&q->PushSt);StackInit(&q->PopSt);return q;
}void myQueuePush(MyQueue* obj, int x) {StackPush(&obj->PushSt,x);}void PushStToPopSt(MyQueue* obj)
{if (StackEmpty(&obj->PopSt)){while(!StackEmpty(&obj->PushSt)){StackPush(&obj->PopSt,StackTop(&obj->PushSt));StackPop(&obj->PushSt);}}
}int myQueuePop(MyQueue* obj) {PushStToPopSt(obj);int ret = StackTop(&obj->PopSt);StackPop(&obj->PopSt);return ret;
}int myQueuePeek(MyQueue* obj) {PushStToPopSt(obj);return StackTop(&obj->PopSt);
}bool myQueueEmpty(MyQueue* obj) {return StackEmpty(&obj->PushSt) && StackEmpty(&obj->PopSt);
}void myQueueFree(MyQueue* obj) {StackDestory(&obj->PushSt);StackDestory(&obj->PopSt);free(obj);
}/*** Your MyQueue struct will be instantiated and called as such:* MyQueue* obj = myQueueCreate();* myQueuePush(obj, x);* int param_2 = myQueuePop(obj);* int param_3 = myQueuePeek(obj);* bool param_4 = myQueueEmpty(obj);* myQueueFree(obj);
*/

也是通过了leetcode:
在这里插入图片描述



http://www.ppmy.cn/ops/152227.html

相关文章

dl学习笔记:(7)完整神经网络流程

完整神经网络流程 反向传播链式求导 代码实现反向传播动量法Momentum开始迭代为什么选择小批量TensorDataset与DataLoader 反向传播 由于本节的公式比较多,所以如果哪里写错了漏写了,还请帮忙指出以便进行改正,谢谢。 在前面的章节已经介绍过…

C语言程序设计十大排序—冒泡排序

文章目录 1.概念✅2.冒泡排序🎈3.代码实现✅3.1 直接写✨3.2 函数✨ 4.总结✅ 1.概念✅ 排序是数据处理的基本操作之一,每次算法竞赛都很多题目用到排序。排序算法是计算机科学中基础且常用的算法,排序后的数据更易于处理和查找。在计算机发展…

PHP CRM售后系统小程序

💼 CRM售后系统 📺这是一款基于PHP和uniapp深度定制的CRM售后管理系统,它犹如企业的智慧核心,精准赋能销售与售后管理的每一个环节,引领企业步入精细化、数字化的全新管理时代。系统集成了客户管理、合同管理、工单调…

kotlin语言

简介 Kotlin由JetBrains公司开发。谷歌宣布其成为安卓第一开发语言。 兼容Java,可以和Java混编。 语言类型 编译型 编译器直接将源代码一次性编译成与CPU相配的二进制文件,计算机可直接执行,例如C,C。 特点:一次编译。不同操…

vue+arcgis api for js实现地图测距的分段统计线段长度

vue页面调用代码&#xff1a; <template><el-button click"handleMeasureDis">地图测距</el-button><el-button click"handleClear">清除</el-button> </template> import measureDistance from /views/fisheryMap/c…

【MySQL】存储引擎有哪些?区别是什么?

频率难度60%⭐⭐⭐⭐ 这个问题其实难度并不是很大&#xff0c;只是涉及到的相关知识比较繁杂&#xff0c;比如事务、锁机制等等&#xff0c;都和存储引擎有关系。有时还会根据场景选择不同的存储引擎。 下面笔者将会根据几个部分尽可能地讲清楚 MySQL 中的存储引擎&#xff0…

豆瓣Top250电影的数据采集与可视化分析(scrapy+mysql+matplotlib)

文章目录 豆瓣Top250电影的数据采集与可视化分析(scrapy+mysql+matplotlib)写在前面数据采集(Visual Studio Code+Navicat)1.观察网页信息2.编写Scrapy代码(Visual Studio Code)2.1 创建Scrapy项目`doubanProject`2.2 创建爬虫脚本`douban.py`2.3 修改`douban.py`的代码2…

springboot基于微信小程序的停车场预订系统

Spring Boot 基于微信小程序的停车场预订系统 在城市交通日益拥堵&#xff0c;停车难问题愈发凸显的当下&#xff0c;Spring Boot 基于微信小程序的停车场预订系统为车主们提供了便捷高效的停车解决方案&#xff0c;让出行停车变得从容有序。借助 Spring Boot 强大的后端开发能…