栈与队列:用栈实现队列

目录

题目:

栈与队列的数据模型对比:

思路分析🎇:

代码分析: 

一、定义队列

二、初始化队列

三、入队

四、出队⭐

代码解析:

五、获取队头元素

六、查看队列是否为空

七、销毁队列

完整代码

需要手撕的栈的代码


题目:

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty)。


实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

说明:

  • 你 只能 使用标准的栈操作 —— 也就是只有 push to toppeek/pop from topsize, 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

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

题目内容:

 

栈与队列的数据模型对比:

思路分析🎇:

本题的核心部分和原理是如何将栈的特点演变成队列的特点,即如何将演化栈的后进先出为队列的先进先出。

按照题目的要求,我们需要使用两个栈进行栈的实现,以此我们可以根据栈的特点,进行数据的传输,和复原来解决问题。

可参考方法:栈与队列:用队列实现栈-CSDN博客

  1. 如图所示,根据队列和栈的不同之处,以题目要求中只能通过出栈的方式来实现出队,所以我们需要对参考方法:栈与队列:用队列实现栈-CSDN博客进行改动。
  2. 因为出队出的是队头,所以根据数据模型对比,需要在栈上的实现是把栈底元素进行输出,于是将栈底元素进行保留,其他的元素通过获取栈底元素的函数以及入栈函数的方法,进入到另一个空的栈中。 
  3. 当然,进入到另一个栈后,表达的形式和原来的栈正好相反,所以为了防止以后不出错,必须再度以相同的方式回到原来的栈中,以此恢复以前的顺序

代码分析: 

一、定义队列

因为本题是需要使用两个栈来实现队列,于是需要对栈的调用,因此队列内部的定义只需要使用两个指向不同栈的指针即可。

二、初始化队列

使用之前定义的队列(MyQueue)创造一个空间,表示队列的创建,随后在这个空间的内部调用栈的初始化函数,对队列中的两个栈进行初始化。

三、入队

因为之前在思路分析中讲诉过出队需要经历,元素的交换、去除、二次交换,而在这些的过程中,入队是不会受到影响的,因为会进行元素顺序的恢复,所以入队的元素只需要插入进不为空的栈的后面即可

四、出队⭐

代码解析:

使用假设的方法,对空和不空的栈进行简化操作,方便之后的操作。

  • 在思路分析中说过,我们要把栈底元素留下,其余元素丢到另一个空的栈中,所以这里需要对栈内的元素有效个数进行判断,确保留下一个。
  • 之后的转移需要用到栈的获取栈底元素函数和入栈函数,进行以循环的方式不断地将每一次的栈底获取插入到"空栈"中。

  • 然后因为题目交给的代码是int类型,表示我们需要输出最后的栈顶也是最后的栈顶元素,并且删除,表示出队。

  • 最后,需要进行栈的复原,以免下次进行出队或则之后的入队操作会因为顺序的错乱而导致的问题。

五、获取队头元素

对于获取栈顶元素,其实就和出队的方式差不多,因为栈不像队列具有指向栈底的指针和对应的函数,于是我们还是需要对栈一步一步的将元素进行迁移,然后复原,且中途没有元素的删除部分。

六、查看队列是否为空

  • 需要两个栈同时为空才行!因为我们进行了互换操作!

七、销毁队列

  • 要分别把两个栈进行销毁后在销毁封存两个栈的指针的结构体

完整代码

需要手撕的栈的代码

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>typedef int STDataType;
typedef struct Stack
{STDataType* a;int top;		// 标识栈顶下一个位置int capacity;
}ST;
//栈的初始化
void STInit(ST* pst);
//栈的销毁
void STDestroy(ST* pst);
// 入栈
void STPush(ST* pst, STDataType x);
//出栈
void STPop(ST* pst);
//获取栈顶元素
STDataType STTop(ST* pst);
//检测栈是否为空
bool STEmpty(ST* pst);
//获取栈的有效元素个数
int STSize(ST* pst);//初始化
void STInit(ST* pst)
{assert(pst);pst->a = NULL;pst->capacity = 0;pst->top = 0;
}//销毁栈
void STDestroy(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->top = pst->capacity = 0;
}// 入栈
void STPush(ST* pst, STDataType x)
{assert(pst);if (pst->top == pst->capacity){int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newcapacity);if (tmp == NULL){perror("realloc fail");return;}pst->a = tmp;pst->capacity = newcapacity;}pst->a[pst->top] = x;pst->top++;
}
//出栈
void STPop(ST* pst)
{assert(pst);// 不为空assert(pst->top > 0);pst->top--;
}
//获取栈顶元素
STDataType STTop(ST* pst)
{assert(pst);// 不为空assert(pst->top > 0);return pst->a[pst->top - 1];
}
//检测栈是否为空
bool STEmpty(ST* pst)
{assert(pst);/*if (pst->top == 0){return true;}else{return false;}*/return pst->top == 0;
}
//获取栈的有效元素个数
int STSize(ST* pst)
{assert(pst);return pst->top;
}

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

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

相关文章

【C++】类与对象 II 【深入浅出 万字详解】

类与对象 II 一、类的6个默认成员函数二、构造函数前言&#xff1a;构造函数产生的由来 及引入C语言中关于初始化会出现的问题总结&#xff1a;&#xff08;一&#xff09;构造函数的 概念&#xff08;二&#xff09;构造函数的 特性★ 构造函数 和 函数声明 的区分 三、析构函…

PaddleClas学习2——使用PPLCNet模型对车辆朝向进行识别(python)

使用PPLCNet模型对车辆朝向进行识别 1. 配置PaddlePaddle,PaddleClas环境2. 准备数据2.1 标注数据格式2.2 标注数据3. 模型训练3.1 修改配置文件3.2 训练、评估4 模型预测1. 配置PaddlePaddle,PaddleClas环境 安装:请先参考文档 环境准备 配置 PaddleClas 运行环境。 2. 准…

无需API开发,伯俊科技实现电商与客服系统的无缝集成

伯俊科技的无代码开发实现系统连接 自1999年成立以来&#xff0c;伯俊科技一直致力于为企业提供全渠道一盘货的服务。凭借其24年的深耕零售行业的经验&#xff0c;伯俊科技推出了一种无需API开发的方法&#xff0c;实现电商系统和客服系统的连接与集成。这种无代码开发的方式不…

Selenium安装WebDriver(含116/117/118/119)

1、确认浏览器的版本 在浏览器的地址栏&#xff0c;输入chrome://version/&#xff0c;回车后即可查看到对应版本 2、找到对应的chromedriver版本 2.1 114及之前的版本可以通过点击下载chromedriver,根据版本号&#xff08;只看大版本&#xff09;下载对应文件 2.2 116版…

【Proteus仿真】【STM32单片机】防火防盗GSM智能家居设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用声光报警模块、LCD1602显示模块、DS18B20温度、烟雾传感器模块、按键模块、PCF8591 ADC模块、红外检测模块等。 主要功能&#xff1a; 系统运行…

Spring学习②__IOC分析

目录 IOC控制反转IOCIOC理论案例IOC的思想&#xff08;注入&#xff09;IOC底层什么是 IOCIOC 底层原理 总结 IOC 控制反转IOC ①控制反转&#xff0c;把对象创建和对象之间的调用过程&#xff0c;交给Spring进行 ②使用IOC目的&#xff1a;为了耦合度降低 IOC理论案例 控制…

聊聊氮化硅(SiNx)在芯片中的重要性

在芯片制造中&#xff0c;有一种材料扮演着至关重要的角色&#xff0c;那就是氮化硅&#xff08;SiNx&#xff09;。尽管它可能并未获得和其他更为熟知的半导体材料&#xff0c;如硅&#xff08;Si&#xff09;、砷化镓&#xff08;GaAs&#xff09;或氮化镓&#xff08;GaN&am…

Failed to execute org.scala-tools:maven-scala-plugin:2.15.2解决

原因也不是很清楚&#xff0c;查看一个博主文章(net.alchim31.maven:scala-maven-plugin&#xff1a;maven依赖无法下载或无法编译)得到的解决方案&#xff1a; 在idea的terminal执行以下语句即可实现maven对scala代码的编译&#xff1a; mvn clean scala:compile compile pac…

4、FFmpeg命令行操作8

生成测试文件 找三个不同的视频每个视频截取10秒内容 ffmpeg -i 沙海02.mp4 -ss 00:05:00 -t 10 -codec copy 1.mp4 ffmpeg -i 复仇者联盟3.mp4 -ss 00:05:00 -t 10 -codec copy 2.mp4 ffmpeg -i 红海行动.mp4 -ss 00:05:00 -t 10 -codec copy 3.mp4 如果音视…

【C++】类与对象 III 【 深入浅出理解 类与对象 】

文章内容 前言 &#xff1a;新关键字explicit 的引入一、explicit关键字二、static成员&#xff08;一&#xff09;概念&#xff08;二&#xff09;特性 三、匿名对象四、友元前言&#xff1a;友元的引入&#xff08;一&#xff09;友元的概念友元分为&#xff1a;友元函数 和 …

java的包装类

目录 1. 包装类 1.1 基本数据类型和对应的包装类 1.2 装箱和拆箱 1.3 自动装箱和自动拆箱 1. 包装类 在Java中&#xff0c;由于基本类型不是继承自Object&#xff0c;为了在泛型代码中可以支持基本类型&#xff0c;Java给每个基本类型都对应了 一个包装类型。 若想了解…