LeetCode 232.用栈实现队列(详解) (๑•̌.•๑)

题目描述:

解题思路: 

创建两个栈,一个用于入数据,一个用于出数据。分别是pushST和popST;

1.如果是入数据就直接入进pushST

2.如果是出数据,先检查popST中有无数据,如果有数据,就直接出。如果没数据,就将pushST中的数据放进popST中,再从popST中出数据。

当pushST中的数据入到popST时,数据是顺序的,刚好满足队列的条件,直接出

用c语言实现栈,没法直接引用,这里需要自己创建一个栈,在完成上述操作。如果还不会栈的小伙伴可以看看我的这篇博客 【数据结构】栈【详解】૮₍ ˃ ⤙ ˂ ₎ა-CSDN博客 

栈的实现:

//栈的声明与定义
typedef int STDataType;//定义栈中的数据类型
struct Stack
{STDataType* a;//用于指向后续开辟的空间int top;       // 栈顶int capacity;  // 容量,方便增容
};//typedef struct Stack ST;
typedef struct Stack Stack;
//初始化栈
void StackInit(Stack* pst);
//摧毁栈
void StackDestroy(Stack* pst);
//入栈
void StackPush(Stack* pst, STDataType x);
//出栈
void StackPop(Stack* pst);
//返回栈顶元素
STDataType StackTop(Stack* pst);// 空返回1 非空返回0
//int StackEmpty(Stack* pst);
//栈的判空操作
bool StackEmpty(Stack* pst);
//返回栈的大小
int StackSize(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 StackDestroy(Stack* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->capacity = pst->top = 0;
}// 性质就决定在栈顶出入数据
void StackPush(Stack* pst, STDataType x)
{assert(pst);if (pst->top == pst->capacity){STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType)*pst->capacity * 2);if (tmp == NULL){printf("realloc fail\n");exit(-1); // 结束整个程序}pst->a = tmp;pst->capacity *= 2;}pst->a[pst->top] = x;pst->top++;
}void StackPop(Stack* pst)
{assert(pst);assert(!StackEmpty(pst));pst->top--;
}STDataType StackTop(Stack* pst)
{assert(pst);assert(!StackEmpty(pst));return pst->a[pst->top - 1];
}// 空返回1 非空返回0
//int StackEmpty(Stack* pst);
bool StackEmpty(Stack* pst)
{assert(pst);return pst->top == 0;
}int StackSize(Stack* pst)
{assert(pst);return pst->top;
}

队列的实现(需要用到前面的栈): 

//用栈定义队列,其中包含两个栈,用于入数据和出数据
typedef struct {Stack pushST;Stack popST;
} MyQueue;/** Initialize your data structure here. */
//队列的初始化
MyQueue* myQueueCreate() {MyQueue* q = (MyQueue*)malloc(sizeof(MyQueue));StackInit(&q->pushST);StackInit(&q->popST);return q;
}/** Push element x to the back of queue. */
//入队列
void myQueuePush(MyQueue* obj, int x) {StackPush(&obj->pushST, x);
}/** Removes the element from in front of queue and returns that element. */
//出队列
int myQueuePop(MyQueue* obj) {/*if(StackEmpty(&obj->popST)){while(!StackEmpty(&obj->pushST)){StackPush(&obj->popST, StackTop(&obj->pushST));StackPop(&obj->pushST);}}*/int top = myQueuePeek(obj);StackPop(&obj->popST);return top;
}/** Get the front element. */
//判断栈内数据的情况,并返回栈顶元素
int myQueuePeek(MyQueue* obj) {if (StackEmpty(&obj->popST)){while (!StackEmpty(&obj->pushST)){StackPush(&obj->popST, StackTop(&obj->pushST));StackPop(&obj->pushST);}}return StackTop(&obj->popST);
}/** Returns whether the queue is empty. */
//队列的判空
bool myQueueEmpty(MyQueue* obj) {return StackEmpty(&obj->pushST) && StackEmpty(&obj->popST);
}
//摧毁队列
void myQueueFree(MyQueue* obj) {StackDestroy(&obj->pushST);StackDestroy(&obj->popST);free(obj);
}

 完整代码:

//栈的声明与定义
typedef int STDataType;//定义栈中的数据类型
struct Stack
{STDataType* a;//用于指向后续开辟的空间int top;       // 栈顶int capacity;  // 容量,方便增容
};//typedef struct Stack ST;
typedef struct Stack Stack;
//初始化栈
void StackInit(Stack* pst);
//摧毁栈
void StackDestroy(Stack* pst);
//入栈
void StackPush(Stack* pst, STDataType x);
//出栈
void StackPop(Stack* pst);
//返回栈顶元素
STDataType StackTop(Stack* pst);// 空返回1 非空返回0
//int StackEmpty(Stack* pst);
//栈的判空操作
bool StackEmpty(Stack* pst);
//返回栈的大小
int StackSize(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 StackDestroy(Stack* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->capacity = pst->top = 0;
}// 性质就决定在栈顶出入数据
void StackPush(Stack* pst, STDataType x)
{assert(pst);if (pst->top == pst->capacity){STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType)*pst->capacity * 2);if (tmp == NULL){printf("realloc fail\n");exit(-1); // 结束整个程序}pst->a = tmp;pst->capacity *= 2;}pst->a[pst->top] = x;pst->top++;
}void StackPop(Stack* pst)
{assert(pst);assert(!StackEmpty(pst));pst->top--;
}STDataType StackTop(Stack* pst)
{assert(pst);assert(!StackEmpty(pst));return pst->a[pst->top - 1];
}// 空返回1 非空返回0
//int StackEmpty(Stack* pst);
bool StackEmpty(Stack* pst)
{assert(pst);return pst->top == 0;
}int StackSize(Stack* pst)
{assert(pst);return pst->top;
}
//用栈定义队列,其中包含两个栈,用于入数据和出数据
typedef struct {Stack pushST;Stack popST;
} MyQueue;/** Initialize your data structure here. */
//队列的初始化
MyQueue* myQueueCreate() {MyQueue* q = (MyQueue*)malloc(sizeof(MyQueue));StackInit(&q->pushST);StackInit(&q->popST);return q;
}/** Push element x to the back of queue. */
//入队列
void myQueuePush(MyQueue* obj, int x) {StackPush(&obj->pushST, x);
}/** Removes the element from in front of queue and returns that element. */
//出队列
int myQueuePop(MyQueue* obj) {/*if(StackEmpty(&obj->popST)){while(!StackEmpty(&obj->pushST)){StackPush(&obj->popST, StackTop(&obj->pushST));StackPop(&obj->pushST);}}*/int top = myQueuePeek(obj);StackPop(&obj->popST);return top;
}/** Get the front element. */
//判断栈内数据的情况,并返回栈顶元素
int myQueuePeek(MyQueue* obj) {if (StackEmpty(&obj->popST)){while (!StackEmpty(&obj->pushST)){StackPush(&obj->popST, StackTop(&obj->pushST));StackPop(&obj->pushST);}}return StackTop(&obj->popST);
}/** Returns whether the queue is empty. */
//队列的判空
bool myQueueEmpty(MyQueue* obj) {return StackEmpty(&obj->pushST) && StackEmpty(&obj->popST);
}
//摧毁队列
void myQueueFree(MyQueue* obj) {StackDestroy(&obj->pushST);StackDestroy(&obj->popST);free(obj);
}

博客到这里也是结束了,喜欢的小伙伴可以点赞加关注支持下博主,这对我真的很重要~~

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/612627.shtml

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

相关文章

Java--Spring项目生成雪花算法数字(Twitter SnowFlake)

文章目录 前言步骤查看结果 前言 分布式系统常需要全局唯一的数字作为id,且该id要求有序,twitter的SnowFlake解决了这种需求,生成了符合条件的这种数字,本文将提供一个接口获取雪花算法数字。以下为代码。 步骤 SnowFlakeUtils …

Linux Ubuntu 20.04.6 Intel WiFi6 Ax411 1690i Ax1690i Killer 解决无线网卡识别不出来问题

项目场景: 网卡型号:英特尔 Killer™ Wi-Fi 6E AX1690 i/s ubuntu 版本 uname -a Linux kuanli 5.15.0-91-generic #101~20.04.1-Ubuntu SMP Thu Nov 16 14:22:28 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux cat /proc/version Linux version 5.15.0-9…

windows11运行bat系统找不到指定的路径。

当运行.bat文件时出现“系统找不到指定的路径”错误通常是因为指定的路径不存在或者路径中包含了错误的字符。有几种方法可以解决这个问题: 检查路径是否存在:确保.bat文件中指定的路径是正确的,并且文件或文件夹确实存在。可以使用文件资源管…

docker 部署项目的操作文档,安装nginx

目录 1 部署环境检查2 相关知识点2.1 docker默认镜像存放地址2.2 docker 的镜像都是tar 包?2.3 Docker-compose 是直接使用镜像创建容器?2.4 Docker Compose down 就是将容器删除?2.5 删除,会删除挂载嘛2.6 DockerFile 和 docker …

实现本地存储函数useLocalStorage

我们经常需要使用 LocalStorage API&#xff0c;一个好用的可组合函数封装将帮助我们更好地使用它&#xff0c;让我们开始吧 &#x1f447;: <script setup langts>import { ref, watch } from "vue"/*** Implement the composable function* Make sure the f…

前端随机验证码安全验证sdk

前端随机验证码安全验证sdk 前言介绍一、效果展示二、使用步骤1.引入库2.参数说明3.方法与事件说明4.如何通过API获取当前用户的验证状态 ​ 前端必备工具推荐网站(免费图床、API和ChatAI等实用工具): http://luckycola.com.cn/ 前言 验证码&#xff1a;是一种校验区分用户是…

vue项目打包优化:缩小体积productionSourceMap设置,使用cdn加速

文章目录 一、vue项目打包体积大优化之productionSourceMap设置1、productionSourceMap 的作用2、禁用 productionSourceMap3、关闭 productionSourceMap4、配置 productionSourceMap 二、vue-cli打包之性能优化-使用cdn加速1、CDN加速是什么2、CDN加速具有以下优点&#xff1a…

Visual Studio 新特性:对 include 指令进行智能诊断

今天&#xff0c;我们很高兴地宣布新功能&#xff1a;#include 语言智能诊断。 此功能自 Visual Studio 2022 v17.9 预览版2 中可用。通过此新功能&#xff0c;您可以获取到有关每个 include 的引用和生成时间的详细信息&#xff0c;从而更好地了解 #include 指令的行为。 &g…

git仓库操作之一:git仓库修改名称

1 先修改“Project name"方法如下&#xff1a; 2 再修改“下载地址和下载后的项目名称”方法如下&#xff1a; 这样就修改完成了。

PhpPythonC++圆类的实现(OOP)

哎......被投诉了 &#x1f62d;&#x1f62d;&#x1f62d;&#x1f62d;&#x1f62d; 其实也不是小编不更&#xff0c;这不是期末了吗&#xff08;zhaojiekou~~&#xff09;&#xff0c;而且最近学的信息收集和ctf感觉好像没找到啥能更的&#xff08;不过最经还是在考虑更一…

JAVA销售数据决策管理系统源码

JAVA销售数据决策管理系统源码 基于BS&#xff08;Extjs Strus2springhibernate Mysql&#xff09;的销售数据的决策支持 主要的功能有 系统功能具体内容包括基础资料、进货管理、出货管理、库存管理、决策分析、系统管理。

活水计划丨改善老年营养,促进老年健康

在中国乡村发展基金会、腾讯公益的支持下&#xff0c;1月10日上午辉县义工联合共济医院&#xff0c;在我市易地搬迁佳怡社区开展“乐伴银龄 社区共建”项目——“老年常见病健康知识讲座”活动。 通过制作宣传横幅、发放科普手册等方式&#xff0c;为协同推进健康中国和积极应对…

《AI基本原理和python实现》栏目介绍

一、说明 栏目《AI基本原理和python实现》的设计目的是为了实现相关算法的python编程。因为用python实现AI需对相关的python库进行全方位了解&#xff0c;本栏目基本包含了【机器学习】相关的经典算法&#xff0c;除此之外还包括了数据分析、时间序列等一些概念和相关python代码…

【SpringCloud Alibaba】Nacos Config配置管理与Gateway 网关

目录 一、Config 远程配置 1.1 config 介绍 1.2 bootstrap.yml 配置文件 二、Gateway 网关 2.1 gateway 介绍 2.2 gateway 使用 2.2.1 方式一 2.2.2 方式二&#xff08;动态路由&#xff09; 一、Config 远程配置 1.1 config 介绍 微服务意味着要将单体应用中的业务拆分…

【Linux】Ubuntu 解压 zip、z01、z02等压缩文件的方法,Linux如何解压分卷压缩的

zip分卷压缩&#xff0c;在windows上压缩来的&#xff0c;如何解压这种文件&#xff1a; -rw-rw-r-- 1 20401094656 Dec 10 20:06 FFHQ.z01 -rw-rw-r-- 1 20401094656 Dec 10 20:10 FFHQ.z02 -rw-rw-r-- 1 20401094656 Dec 10 23:22 FFHQ.z03 -rw-rw-r-- 1 20401094656 Dec 10…

PyQt QTextEdit 详解

PyQt QTextEdit 详解 QTextEdit 是 PyQt 中用于编辑和显示多行文本的组件。它允许用户输入、编辑和格式化文本&#xff0c;并支持丰富的文本编辑功能。以下是关于 QTextEdit 的一些详细解释和示例&#xff1a; 创建 QTextEdit 对象&#xff1a; 要创建一个 QTextEdit 对象&a…

5.MapReduce之Combiner-预聚合

目录 概述本地预计算 Combiner 意义实践前提代码日志观察 结束 概述 在 MR、Spark、Flink 中&#xff0c;常用的减少网络传输的手段。 通常在 Reducer 端合并&#xff0c;shuffle 的数据量比在 Mapper 端要大&#xff0c;根据业务情况及数据量极大时&#xff0c;将大幅度降低效…

[足式机器人]Part3 机构运动学与动力学分析与建模 Ch00-3(1) 刚体的位形 Configuration of Rigid Body

本文仅供学习使用&#xff0c;总结很多本现有讲述运动学或动力学书籍后的总结&#xff0c;从矢量的角度进行分析&#xff0c;方法比较传统&#xff0c;但更易理解&#xff0c;并且现有的看似抽象方法&#xff0c;两者本质上并无不同。 2024年底本人学位论文发表后方可摘抄 若有…

pyqt treeWidget树生成

生成treeWidget树与获取treeWidget树节点的数据 # encodingUTF-8 import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication, QTreeWidgetItem, QLineEdit, QSpinBox, QComboBox from PyQt5.QtWidgets import QWidget from release_test import Ui_F…

K8S容器编排高级应用

K8S容器编排高级应用 1.Pod控制器 pod控制器帮助我们自动管理pod&#xff0c;并满足期望的pod数量。pod控制器通过label标签来管理pod。在资源文件中通过selector来配置选择器&#xff0c;通过kind来配置控制器。一般我们的应用在生产环境用k8s一定要用pod控制器管理pod而不是…