力扣刷题 -- 232. 用栈实现队列

article/2025/6/12 23:03:42

1. 题目

 2. 思路分析

1)创建两个栈空间,PushST,PopST;

2)插入数据往PushST插,判断PopST是否为空,如果为空直接往PopST出数据;如PopST不为空,就先把PopST的数据先出栈;

3)PopST全部出队列。

3. 代码实现 

typedef int STDataType;
typedef struct Stack
{STDataType* arr;int top;//栈顶(相当于size)int capacity;//栈的大小
}ST;//初始化
void StackInit(ST* ps)
{ps->arr = NULL;ps->top = ps->capacity = 0;
}
//销毁
void StackDestroy(ST* ps)
{assert(ps);if (ps->arr != NULL){free(ps->arr);ps->arr = NULL;ps->capacity = ps->top = 0;}
}
//入栈
void StackPush(ST* ps, STDataType x)
{assert(ps);//入栈的前提:要有足够大的空间if (ps->top == ps->capacity)//空间不够{int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;STDataType* temp = realloc(ps->arr, newcapacity * sizeof(STDataType));if (temp == NULL){perror("realloc fail!");exit(1);}else//扩容成功{ps->arr = temp;ps->capacity = newcapacity;}}//空间够了,进行入栈ps->arr[ps->top] = x;ps->top++;
}
//判断栈顶为空
bool StackEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}
//出栈
void StackPop(ST* ps)
{assert(ps);assert(!StackEmpty(ps));ps->top--;
}
//获取栈顶元素
STDataType Stacktop(ST* ps)
{assert(ps);return ps->arr[ps->top-1];
}
//获取栈顶元素有效个数
int StackSize(ST* ps)
{assert(ps);return ps->top;
}
///以上是栈的结构和相关方法///typedef struct {ST pushST;ST popST;
} MyQueue;MyQueue* myQueueCreate() {MyQueue* q=(MyQueue*)malloc(sizeof(MyQueue));StackInit(&q->pushST);StackInit(&q->popST);return q;
}
//入队列
void myQueuePush(MyQueue* obj, int x) {StackPush(&obj->pushST,x);
}int myQueuePop(MyQueue* obj) {//先判断popST是否为空if(StackEmpty(&obj->popST)){while(!StackEmpty(&obj->pushST)){StackPush(&obj->popST,Stacktop(&obj->pushST));StackPop(&obj->pushST);}}int top=Stacktop(&obj->popST);StackPop(&obj->popST);return top;
}int myQueuePeek(MyQueue* obj) {//先判断popST是否为空if(StackEmpty(&obj->popST)){while(!StackEmpty(&obj->pushST)){StackPush(&obj->popST,Stacktop(&obj->pushST));StackPop(&obj->pushST);}}int top=Stacktop(&obj->popST);return top;
}bool myQueueEmpty(MyQueue* obj) {return  StackEmpty(&obj->pushST)&&StackEmpty(&obj->popST);
}void myQueueFree(MyQueue* obj) {StackDestroy(&obj->pushST);StackDestroy(&obj->popST);free(obj);obj=NULL;
}


http://www.hkcw.cn/article/xpWXRlFoUo.shtml

相关文章

结构型设计模式之Decorator(装饰器)

结构型设计模式之Decorator(装饰器) 前言: 本案例通过李四举例,不改变源代码的情况下 对“才艺”进行增强。 摘要: 摘要: 装饰器模式是一种结构型设计模式,允许动态地为对象添加功能而不改变其…

完美解决在pycharm中创建Django项目安装mysqlclient报错的问题(windows下)

正常情况下,在Windows安装mysqlclient会报错: 我这里用的是anaconda虚拟环境,安装前必须激活anacoda虚拟环境, 怎么激活虚拟环境?可以参考超详细的pycharmanaconda搭建python虚拟环境_pycharm anaconda环境搭建-CSDN博…

mac环境下的python、pycharm和pip安装使用

Python安装 Mac环境下的python安装 下载地址:https://www.jetbrains.com.cn/pycharm/ 一直点击下一步即可完成 在应用程序中会多了两个图标 IDLE 和 Python launcher IDLE支持在窗口中直接敲python命令并立即执行,双击即可打开 Python launcher双击打…

Spark 单机模式部署与启动

🚀 Spark 单机模式部署与启动教程(适配 Hadoop 3.1.1) 本文记录了在 Linux 环境中部署 Spark 的完整过程,使用 Standalone 单机模式,适配 Hadoop 3.1.1,最终可通过 Web 页面访问 Spark Master 状态界面。 …

【数据库】安全性

数据库安全性控制的常用方法:用户标识和鉴定、存取控制、视图、审计、数据加密。 1.用户标识与鉴别 用户标识与鉴别(Identification & Authentication)是系统提供的最外层安全保护措施。 2.存取控制 2.1自主存取控制(简称DAC) (1)同一用户对于不同的数据对…

数据采集器支撑循环水养殖系统智能化运维案例

一、项目背景 渔业养殖是关系到我国食物安全和海洋经济发展的重要产业,随着科技的不断进步,传统的养殖模式面临着诸多挑战,如养殖环境复杂、水质变化难以实时监测、设备运行状态不稳定等,这些问题不仅增加了养殖成本,还…

【卡点变速】节拍同步 讨论

一、 "首尾对齐"的前提是变速在合理范围内 变速导致动作资源时长不足的情况咋办? 计算验证: 变速前: 动作原始:1小节 @ BPM 100 = 2.4秒变速后: 变速比例 = 1.18倍速变速后时长 = 2.4秒 1.18 ≈ 2.03秒歌曲要求:2.03秒结果:✓ 完美匹配! 但是会有问题的情…

TDengine 高级功能——流计算

简介 在时序数据的处理中,经常要对原始数据进行清洗、预处理,再使用时序数据库进行长久的储存,而且经常还需要使用原始的时序数据通过计算生成新的时序数据。在传统的时序数据解决方案中,常常需要部署 Kafka、Flink 等流处理系统…

数据资产是什么?数据资产平台如何发挥作用?

目录 一、数据资产是什么 (一)数据资产的定义 (二)数据资产的特征 二、数据资产的重要性 (一)支持企业决策 (二)提升企业竞争力 (三)促进业务创新 &a…

MCP 科普 + 实践:基于 HAP 的大模型外部交互协议应用与开发案例

基础知识 Function Call 背景:以前的AI大模型,就像一个知识丰富但被困在屋子里的人,只能依靠自己已有的知识回答问题,没有办法获取实时的数据或者与外部的系统进行交互 Function Call 是 OPEN AI 在 2023 年推出的一个非常重要的…

颈部的 “异常坚持”

生活中,有些人的颈部会突然变得 “异常坚持”—— 头部不受控制地偏向一侧,或是不自主地旋转、后仰,仿佛被无形的力量牵引着。这种情况不仅影响外观,还会带来强烈的不适感,颈部肌肉紧绷、酸痛,像被一根绳索…

Windows应用-音视频捕获

下载“Windows应用-音视频捕获”项目 本应用可以同时捕获4个视频源和4个音频源,可以监视视频源图像,监听音频源;可以将视频源图像写入MP4文件,将音频源写入MP3或WAV文件;还可以录制系统播放的声音。本应用使用MFC对话框…

Linux账号和权限管理

1 Linux用户账号和组账号 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪&…

Linux——初步认识Shell、深刻理解Linux权限

文章目录 文章引入初步认识Shell深入理解Linux下的权限用户的切换使用sudo进行短暂提权权限的深入理解权限的本质权限的意义如何控制权限Linux下的权限属性的分类Linux下对于角色的分类文件的权限查询权限的具体表现普通文件的权限表现chmod指令、chown指令和chgrp指令chmod——…

Redis底层数据结构之深入理解跳表(1)

在上一篇文章中我们详细的介绍了一下Redis中跳表的结构以及为什么Redis要引入跳表而不是平衡树或红黑树。这篇文章我们就来详细梳理一下跳表的增加、搜索和删除步骤。 SkipList的初始化 跳表初始化时,将每一层链表的头尾节点创建出来并使用集合将头尾节点进行存储&…

嵌入式硬件篇---龙芯2k1000串口

针对串口错误 “device reports readiness to read but returned no data (Device disconnected or multiple access on port?)” 的排查和解决方法 硬件方面 检查连接 确认串口设备(如串口线、连接的模块等)与龙芯设备之间的物理连接是否牢固&#xf…

Ubuntu安装Docker命令清单(以20.04为例)

在你虚拟机上完成Ubuntu的下载后打开终端!!! Ubuntu安装Docker终极命令清单(以20.04为例) # 1. 卸载旧版本(全新系统可跳过) sudo apt-get remove docker docker-engine docker.io containerd …

数据结构:递归:自然数之和

目录 递归解法 🔹第一步:定义本质问题 🔹第二步:分解问题结构 🔹第三步:定义初始条件 🔹第四步:递归思想的自然生成 循环解法 🔹第 1 步:定义问题最小…

Pandas 技术解析:从数据结构到应用场景的深度探索

序 我最早用Python做大数据项目时,接触最早的就是Pandas了。觉得对于IT技术人员而言,它是可以属于多场景的存在,因为它的本身就是数据驱动的技术生态中,对于软件工程师而言,它是快速构建数据处理管道的基石&#xff1…

CRM管理软件的数据可视化功能使用技巧:让数据驱动决策

在当今数据驱动的商业环境中,CRM管理系统的数据可视化功能已成为企业优化客户管理、提升销售效率的核心工具。据企销客研究显示,具备优秀可视化能力的CRM系统,用户决策效率可提升47%。本文将深入解析如何通过数据可视化功能最大化CRM管理软件…