数据结构-栈、队列-相关练习

news2024/9/21 1:30:38

数据结构-栈、队列-相关练习

  • 1.用队列实现栈
  • 2.用栈实现队列
  • 3.设计循环队列

1.用队列实现栈

用队列实现栈

  • 题目概述:请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppopempty)。

这里只讲大致思路,如下图:

在这里插入图片描述
互相倒就行了,下面讲个具体过程:

  • 第一步:入队
    在这里插入图片描述
  • 第二步:倒数据
    留下的那个,就是最后的一个数据。
    在这里插入图片描述
  • 第三步:出队/出栈
    符合后入先出。
    在这里插入图片描述
    我写的:
    在这里插入图片描述
    队列的数据结构CV一下就行。

2.用栈实现队列

用栈实现队列

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

总体思路:
在这里插入图片描述
讲个具体过程:

  • 第一步:入栈
    在这里插入图片描述
  • 第二步:倒数据
    倒后顺序也倒了,此时stackpop出栈时,数据满足先入先出。
    在这里插入图片描述
  • 第三步:出栈/出队
    在这里插入图片描述
  • 如果又有数据入栈
    在这里插入图片描述
  • 什么时候再倒数据?
    stackpop为空的时候再倒。
    在这里插入图片描述

我写的:
在这里插入图片描述
其中,栈的数据结构,同样CV过去。

3.设计循环队列

设计循环队列

题目概述:设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。

一看到循环,我首先想到了链表:

A
B
C
...

但这样并不便于实现:
在队列为空时,队首等于队尾;在队列为满时,队首还是等于队尾。
有三个解决方法:

  • 加一个size
  • 多一个结点,避免冲突
  • 不用链表

我选第三个方法,用了数组。

而主要问题转化为,如何用下标表示循环。


先建好结构体:

typedef struct {
    int* a;
    int head;
    int tail;
    int k;
} MyCircularQueue;

在初始化时,发现,如果创建k个元素大小的数组,在队列为空时,队首等于队尾;在队列为满时,队首还是等于队尾。
与链表相同的问题,但用数组解决就简单很多了:创建k+1个元素大小的数组就行。
此时,tail为队尾的下一个元素的下标。


在后续的处理中,需要面对主要的问题:如何处理循环?

  • 判满:

总数为k+1,下标最大就为k,存满了就是这样:

下标0123k
tailhead

判满时,可以用tail + 1==head

或者这样:

下标0123k
headtail

对于tail,此时,再+1就越界了,根据观察,可以用(tail + 1)%(k + 1) == head来模拟循环。

  • 取尾:
    正常情况,tail-1就是尾部元素的下标,但下面这种情况就是不正常的:
下标0123k
tailhead

此时,可以用a[ (tail + k) % (k + 1) ]来模拟循环。

我写的完整代码:

typedef struct {
    int* a;
    int head;
    int tail;
    int k;
} MyCircularQueue;


MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* ret = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    ret->a = (int*)malloc(sizeof(int)*(k+1));
    ret->head = ret->tail = 0;
    ret->k = k;
    return ret;
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    assert(obj);
    return obj->head == obj->tail;
}

bool myCircularQueueIsFull(MyCircularQueue* obj) {
    assert(obj);
    return (obj->tail + 1)%(obj->k + 1) == obj->head;
}

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    assert(obj);
    if(myCircularQueueIsFull(obj))
        return false;
    obj->a[obj->tail++] = value;
    obj->tail = obj->tail % (obj->k+1);
    return true;
}

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    assert(obj);
    if(myCircularQueueIsEmpty(obj))
        return false;
    obj->head++;
    obj->head = obj->head % (obj->k+1);
    return true;
}

int myCircularQueueFront(MyCircularQueue* obj) {
    assert(obj);
    if(myCircularQueueIsEmpty(obj))
        return -1;
    else 
        return obj->a[obj->head];
}

int myCircularQueueRear(MyCircularQueue* obj) {
    assert(obj);
    if(myCircularQueueIsEmpty(obj))
        return -1;
    else 
        return obj->a[(obj->tail+obj->k)%(obj->k+1)];
}


希望本篇文章对你有所帮助!并激发你进一步探索数据结构的兴趣!

本人仅是个C语言初学者,如果你有任何疑问或建议,欢迎随时留言讨论!让我们一起学习,共同进步!

相关文章:
数据结构-栈、队列-详解

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

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

相关文章

《信息技术 云计算 边缘云通用技术要求》国家标准发布,九州未来参编

日前,2024年第17号国家标准公告发布,由全国信标委云计算标准工作组组织制定、九州未来作为行业专家单位参编的《信息技术 云计算 边缘云通用技术要求》国家标准正式获批发布。 边缘云作为云计算技术的有效补充和拓展,能够实现将云计算能力拓展…

信捷 XD PLC 数据寄存器的偏移量

信捷 XD PLC,数据寄存器 D 可用作软元件的偏移量,使得软元件的使用更加简单和便于控制。 格式:Dn[Dm]、Xn[Dm]、Yn[Dm]、Mn[Dm]等。 带偏移的位组成的字寄存器:DXn[Dm]表示 DX[nDm]。 带偏移的软元件,偏移量只可用软…

信息安全发展阶段与形式

关注这个证书的其他相关笔记:NISP 一级 —— 考证笔记合集-CSDN博客 0x01:信息安全的发展阶段 信息安全的发展阶段可以参照下面的思维导图: 0x02:我国的信息安全形式 2013 年,“棱镜门” 事件在全球持续发酵&#xf…

创业型公司如何实现数字化营销突破?

​在当今数字化时代,创业型公司可谓机遇与挑战并存。如何利用数字化营销手段实现突破,成为发展关键。 一、现状之困 资源有限:创业型公司资金、人力相对匮乏,难在传统营销上大笔投入。 品牌知名度低:新公司在市场上认…

【启明智显技术分享】探讨CAN总线相关知识以及Model3C 2路CAN的应用

一、 CAN总线相关知识 CAN总线概述 CAN(Controller Area Network)总线是一种高实时性、高可靠性和灵活性的串行通信协议,广泛应用于汽车和工业控制系统中。它由德国BOSCH公司开发,最高速率可达到1Mbps,具有强大的检错…

一台手机一个ip地址吗?手机ip地址泄露了怎么办

在数字化时代,‌手机作为我们日常生活中不可或缺的一部分,‌其网络安全性也日益受到关注。‌其中一个常见的疑问便是:‌“一台手机是否对应一个固定的IP地址?‌”实际上,‌情况并非如此简单。‌本文首先解答这一问题&a…

jQuery入门(七)jQuery实现按钮分页

一、分页案例分析 功能分析:使用分页插件,实现分页,效果如下图: 二、实现思路和代码 2.1)页面实现分析 1.引入分页插件的样式文件和 js 文件。 2. 定义当前页码和每页显示的条数。(分页必备信息) 3. 调用查询数据…

京东API接口:商品详情页呈现商品的全网价格数据信息

如今,不少品牌企业为更好销售商品、塑造品牌,都开设了自己的自有商城。那么,对于这类自有商城平台,该如何做才能更好地提升商品的呈现效果呢?一个比较好的建议是,在电商商品详情界面上呈现出商品的全网价格…

IMU助力JAXA空间站机器人

近日,日本宇宙航空研究开发机构(JAXA)宣布,在国际空间站(ISS)实验舱“希望号”(Kibo)上部署的一款移动摄像机器人将采用Epson M-G370系列惯性测量单元(IMU)。…

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——10.继承

1.继承的概念及定义 1.1继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保 持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象 程序设计的层…

华为OD机试真题 - 最长连续子序列 - 双指针(Python/JS/C/C++ 2024 D卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…

二叉树知识点

参考这篇文章二叉树知识点最详细最全讲解-CSDN博客 目录 预备知识 基本术语 相关性质 1.二叉树的定义 2.二叉树的性质 3.二叉树的种类 3.1 满二叉树 3.2 完全二叉树 3.3 二叉查找树 3.4 平衡二叉搜索树 4.二叉树的存储方式 4.1 链式存储 4.2 顺序存储 4.二叉树…

Behind the Code:与 Rakic 和 Todorovic 对话 OriginTrail 如何实现 AI 去中心化

原文:https://www.youtube.com/watch?vZMuLyLCtE3s&listPLtyd7v_I7PGnko80O0LCwQQsvhwAMu9cv&index12 作者:The Kusamarian 编译:OneBlock 随着人工智能技术的飞速发展,一系列前所未有的挑战随之而来:模型的…

NineData云原生智能数据管理平台新功能发布|2024年8月版​​

本月发布 10 项更新,其中重点发布 5 项、其他发布 5 项。 重点发布​ 数据库 DevOps - 敏感数据保护功能大幅升级​ 敏感数据保护全新升级,新增支持敏感数据等级,方便进行分类分级管控,加入数据类型概念,用于智能识…

分享基于PDF.JS的移动端PDF阅读器代码

一、前言 在之前的文章《分享基于PDF.js的pdf阅读器代码》里提到了PC端基于PDF.js的阅读器,本文将提供针对移动端的版本。 二、pdfViewer 为了能够直接使用,这里分享一下经过简单修改后能直接使用的pdfViewer代码: pdfViewer代码目录&…

SpringBoot2:请求处理原理分析-FORM表单请求接口

一、RESTFUL简介 Rest风格支持(使用HTTP请求方式,动词来表示对资源的操作) 以前:/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户 现在: /user GET-获取用户 DELETE-删除用户 PUT-修改…

气膜快递仓:便捷与效率的完美结合—轻空间

随着快递行业的飞速发展,仓储物流的需求日益增加。在这个以速度为核心竞争力的行业中,如何快速、高效地处理大量货物成为企业亟待解决的问题。气膜快递仓作为一种新型仓储解决方案,以其便捷与效率的优势,迅速成为市场的宠儿&#…

【多线程】深入剖析生产者-消费者模型

💐个人主页:初晴~ 📚相关专栏:多线程 / javaEE初阶 一、阻塞队列 阻塞队列是⼀种特殊的队列,也遵守 "先进先出" 的原则。是在普通的队列基础上做出了补充。 java标准库中的原有的队列Queue及其子类&#xf…

ElasticSearch-ELK

Logstash Logstash 配置文件结构Logstash 导入数据到 ES同步数据库数据到 ES FileBeatELK(采集 Tomcat 服务器日志) 使用FileBeats将日志发送到LogstashLogstash输出数据到Elasticsearch(logstash开头的索引) 利用Logstash过滤器解…

JVM4-运行时数据区

目录 概述 程序计数器 栈 Java虚拟机栈 概述 栈帧的组成 局部变量表 操作数栈 帧数据 栈内存溢出 本地方法栈 堆 方法区 类的元信息 运行时常量池 方法区的实现 方法区的溢出 字符串常量池 直接内存 概述 Java虚拟机在运行Java程序过程中管理的内存区域&am…