用栈实现队列(C语言)

目录

  • 题目
    • 题目分析
  • 代码
    • 栈的实现
      • 结构体。
      • 栈的初始化
      • 栈的销毁
    • 入栈
      • 删除
      • 查找顶部数据
      • 判空
    • 答案
      • 结构体
      • 初始化
      • 插入数据
      • 删除数据
      • 获取队列开头元素
      • 判空
      • 销毁栈

题目

题目分析

链接: 题目

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

实现 MyQueue 类:

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

根据题目,我们可以知道,我们需要用两个栈来实现队列,的出入规则是后进先出,而队列的出入规则是先进先出
如果我们现在又两个栈,pushpstpopst,先在pushst中入4个数据(4,3,2,1)。
在这里插入图片描述
如果我们要出数据的话,我们根据队列的出入原则,应该出数据1,所以我们可以把pushst里面的数据全部倒入到popst中,那么popst中的数据为(1,2,3,4).
如图:
在这里插入图片描述
如果需要出数据的话,直接按照顺序出就可以了。
那么,问题来了,我们要入数据,需要在哪个栈里面入?
答案是pushst.如果我们要入数据(5,6).
在这里插入图片描述
pushst拿来入数据,popst拿来出数据,刚好可以满足队列的需求。先出四个数据。
在这里插入图片描述
想再出数据时,已经没有数据了,我们需要从pushst里再次倒入数据(5,6),
在这里插入图片描述
再依此类推…

代码

栈的实现

我们实现栈使用的是数组。

结构体。

先创建一个结构体

typedef int STDataType;
typedef struct stack
{
	STDataType* a;
	int top;//栈当前大小
	int capacity;//栈的大小
}ST;

栈的初始化

void STInit(ST* pst)
{
	assert(pst);
	pst->a = NULL;
	pst->capacity = 0;
	pst->top = 0;
}

栈的销毁

void STDestory(ST* pst)
{
	assert(pst);
	free(pst->a);
	pst->a = NULL;
	pst->capacity = pst->top = 0;
}

入栈

void Push(ST* pst, STDataType x)
{
	assert(pst);
	if (pst->top == pst->capacity)//如果栈的空间不够了,我们需要扩容。
	{
		int newnode = pst->capacity == 0 ? 4 : pst->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newnode);
		if (tmp == NULL) {
			perror("realloc:fail");
		}
		pst->a = tmp;
		pst->capacity = newnode;
	}
	pst->a[pst->top++] = x;
}

删除

void Pop(ST* pst)
{
	assert(pst);
	assert(pst->top > 0);
	pst->top--;//只需要顶部删除即可
}

查找顶部数据

STDataType Top(ST* pst)
{
	return pst->a[pst->top-1];
}

判空

bool STEmpty(ST* pst)
{
	assert(pst);
	return pst->top == 0;
}

答案

我们需要先创建两个栈的结构体

结构体

typedef struct {
    ST pushst;
    ST popst;
} MyQueue;

初始化

MyQueue* myQueueCreate() {
    MyQueue * obj = (MyQueue*)malloc(sizeof(MyQueue));
    STInit(&obj->pushst);//对每一个队列进行初始化
    STInit(&obj->popst);
    return obj;
}

插入数据

void myQueuePush(MyQueue* obj, int x) {
    Push(&obj->pushst,x);//只需要往pushst里面插入就可以了
}

删除数据

先对popst判空,如果为空,我们需要倒入数据后,再删除数据。

int myQueuePop(MyQueue* obj) {
    if(STEmpty(&obj->popst))
    {
     while(!STEmpty(&obj->pushst))
        {
            Push(&obj->popst,Top(&obj->pushst));
            Pop(&obj->pushst);//倒入一个,记得删除一个
        }
    }
      int top = Top(&obj->popst);//获取顶部苏数据
        Pop(&obj->popst);//删除顶部数据
        return top;
}

获取队列开头元素

跟myQueuePop(MyQueue* obj)函数类似

int myQueuePeek(MyQueue* obj) {
   
     if(STEmpty(&obj->popst))
    {
     while(!STEmpty(&obj->pushst))
        {
            Push(&obj->popst,Top(&obj->pushst));
            Pop(&obj->pushst);
        }
    }
    return Top(&obj->popst);
}

判空

两个栈为空,队列才为空。

bool myQueueEmpty(MyQueue* obj) {
    return STEmpty(&obj->popst) && STEmpty(&obj->pushst);
}

销毁栈

先要对连个队列进行销毁,再对两个栈的结构体销毁。

void myQueueFree(MyQueue* obj) {
    STDestory(&obj->popst);
    STDestory(&obj->pushst);
    free(obj);
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习系列】使用高斯贝叶斯模型进行数据分类的完整流程

目录 一、导入数据 二、选择特征 三、十折交叉验证 四、划分训练集和测试集 五、训练高斯贝叶斯模型 六、预测测试集 七、查看训练集和测试集上的分数 八、查看混合矩阵 九、输出评估指标 一、导入数据 # 根据商户数据预测其是否续约案例 import pandas #读取数据到 da…

驱动编译报error: negative width in bit-field ‘<anonymous>’错误

错误如下图所示: 代码如下: 问题点:module_param的其他用户的权限参数上。 在Linux中,文件权限由读(r)、写(w)、执行(x)权限组成,分别对应数值4、2、1。 第一位0是占位符,在这里没有意义,因为…

Cloneable接口和深拷贝

在java中如何对对象进行拷贝呢?我们可以使用Object类中的clone方法。 一、浅拷贝 在使用clone方法对对象进行拷贝的时候,需要注意: 1.需要重写clone方法; 2.clone方法的返回值是Object类,需要强制类型转化&#xf…

软考之零碎片段记录(三十一)+复习巩固(错题整理,知识点总结,易错题)

1. 奇偶校验 只能检测一位数的错误。但无法纠正错误。若有奇数个数据位出错,可检测。有局限性。 2. 深度与广度优先遍历 参考题【【数据结构自用】1.图深度优先遍历2.找有向图中的强连通分量数目3.给出图的任意两个拓扑序列】https://www.bilibili.com/video/BV…

python 面对对象 类 魔法方法

魔法方法 一、__init__ 构造函数,可以理解为初始化 触发条件:在实例化的时候就会触发 class People():def __init__(self, name):print(init被执行)self.name namedef eat(self):print(f{self.name}要吃饭)a People(张三) a.eat() # in…

前端 防抖和节流

在前端开发中,防抖(Debounce)和节流(Throttle)是两种常用的性能优化技术,尤其在处理频繁触发的事件时显得尤为重要。无论是在用户输入、窗口调整大小,还是滚动事件中,这两种技术都可…

HarmonyOS 鸿蒙应用开发 - 多态样式 stateStyles

前言:Styles和Extend仅仅应用于静态页面的样式复用,stateStyles可以依据组件的内部状态的不同,快速设置不同样式,类似于css伪类,但语法不同。 ArkUI提供以下四种状态: focused:获焦态。normal&…

每日一题 包含不超过两种字符的最长子串

目录 1.前言 2.题目解析 3.算法原理 4.代码实现 1.前言 首先我打算介绍一下,我对滑动窗口的理解。 滑动窗口可以分为四个步骤: 进窗口: 在这一步骤中,我们决定了要在窗口中维护的信息。例如,在这个问题中&#xff…

学习经验分享【37】YOLOv10解读——最新YOLO版本

YOLO算法更新速度很快,已经出到V10版本,后续大家有想发论文或者搞项目可更新自己的baseline了。有需要改进方法的和相关资料可以关注后私信获取。 代码:GitHub - THU-MIG/yolov10: YOLOv10: Real-Time End-to-End Object Detection 摘要&…

LabVIEW控制Trio控制器

将LabVIEW与Trio控制器结合,可以实现对复杂运动系统的控制和监测。以下是详细的方法和注意事项: 一、准备工作 软件安装: 安装LabVIEW开发环境,确保版本兼容性。 安装Trio控制器的相关驱动程序和软件,如Trio Motion …

数据驱动的UI艺术:智能设计的视觉盛宴

数据驱动的UI艺术:智能设计的视觉盛宴 引言 在当今这个数据泛滥的时代,大数据不仅仅是一种技术手段,它更是一种艺术形式。当大数据遇上UI设计,两者的结合便催生了一种全新的艺术形式——数据驱动的UI艺术。本文将探讨如何将数据…

项目如何有效做资源管理?易趋项目管理软件让资源管理可视化

在项目管理的过程中,有效的资源管理能够确保资源得到合理的分配和使用,避免资源的浪费和冗余,进而提高整体工作效率、确保项目的成功;同时降低组织的运营成本。 但在项目推进过程中,项目经理总会面临各种资源管理的难…

Linux-命令上

at是一次性的任务,crond是循环的定时任务 如果 cron.allow 文件存在,只有在文件中出现其登录名称的用户可以使用 crontab 命令。root 用户的登录名必须出现在 cron.allow 文件中,如果这个文件存在的话。系统管理员可以明确的停止一个用户&am…

Langchain-Chatchat的markdownHeaderTextSplitter使用

文章目录 背景排查步骤官方issue排查测试正常对话测试官方默认知识库Debug排查vscode配置launch.json命令行自动启动condadebug知识库搜索测试更换ChineseRecursiveTextSplitter分词器 结论 关于markdownHeaderTextSplitter的探索标准的markdown测试集Langchain区分head1和head…

Notes for video: EDC-Con 2022/01 - EDC Conceptual Overview and Architecture

Eclipse Dataspace Connector 中文概念 Eclipse Dataspace Connector (EDC) 是一个开源项目,旨在提供一种标准化的方法来连接和共享数据空间中的数据。它是 Eclipse Foundation 下的一个项目,目标是促进数据共享和数据交换的互操作性。以下是 EDC 的一些…

【前端学习——react坑】useState使用

问题 使用useState 时,例如 const [selectedId, setSelectedId] useState([false,true,false]);这样直接利用,无法引发使用selectedId状态的组件的变化,但是selectedId是修改了的 let tempselectedId;temp[toggledId]selectedId[toggledId…

MySQL数据库的数据文件保存在哪?MySQL数据存在哪里

在安装好MySQL数据库使用一段时间后,会产生许多的数据库和数据。那这些数据库的数据文件存放在本地文件夹的什么位置呢 一、默认位置 一般来说MySQL数据库的数据文件都是存放在data文件夹之中,但是根据使用的存储引擎不同,产生的一些文件也…

C++初阶之模板进阶

个人主页:点我进入主页 专栏分类:C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂 目录 一.非类型模板参数 二.模板的特化 2.1引入 2.2全特化 2.3…

关于pytest中用例名称使用中文乱码的解决

场景:使用pytest.mark.parametrize装饰器为用例自定义名称时,运行显示乱码。如下图所示: 解决方案: 1.在根目录 pytest.ini中增加一行代码 [pytest] disable_test_id_escaping_and_forfeit_all_rights_to_community_supportTrue…

Point-Nerf 理论笔记和理解

文章目录 什么是point nerf 和Nerf 有什么区别Point Nerf 核心结构有哪些?什么是point-based radiance field? 点云位置以及置信度是怎么来Point pruning 和 Point Growing 什么是point nerf 和Nerf 有什么区别 基本的nerf 是通过过拟合MLP来完成任意视角场景的重…