数据结构——栈和队列的表示与实现详解

目录

1.栈的定义与特点 

2.队列的定义与特点 

3.案例引入 

4.栈的表示和操作的实现 

1.顺序栈的表示 

代码示例:

2.顺序栈的初始化 

代码示例:

3.判断栈是否为空 

代码示例:

4.求顺序栈长度 

代码示例:

5.清空顺序栈 

代码示例:

6.销毁顺序栈 

代码示例:

7.顺序栈的入栈 

代码示例:

8.顺序栈的出栈 

代码示例:

5.链栈的表示和实现 

代码示例:

1.链栈的初始化 

代码示例:

2.判断链栈是否为空 

代码示例:

3.链栈的入栈 

代码示例:

4.链栈的出栈 

代码示例:

5.取栈顶元素 

代码示例:

6.栈与递归 

1.递归问题的求法 

2.递归的定义 

3.递归的优缺点 

7.队列的表示和操作 

1.队列的抽象数据类型定义 

2.队列的顺序表示和实现 

代码示例:

3.解决假上溢的办法——循环队列 

4.循环队列的类型定义 

代码示例:

5.队列的初始化 

代码示例:

6.求队列长度 

代码示例:

7循环队列入队 

代码示例:

8.循环队列出队 

代码示例:

9.取队头元素 

代码示例:

8.链队列

1.链队的类型定义 

代码示例:

2.链队初始化 

代码示例:

3.销毁链队列 

代码示例:

4.将元素e入队 

代码示例:

5.链队列出队 

代码示例:

6.求链队列的队头元素 

代码示例:

9.总的代码


1.栈的定义与特点 

874369c49c014acf9f6f9bad4369ef6c.png

313d5ec227264ce6b2093b4769a97be1.png

86ec6a93b6d94810972bf17404b6d16a.png

ab55bfce66d045ffaad646611229db8d.png

ca36895a430e4655a9d2073fe9ef4dc6.png

1cd453c687fa4a1e8c174afd8110ece4.png

8c4673c2fbe049f288bc7abb89058f51.png

2.队列的定义与特点 

705998c423464a2693638d425f3eebd9.png

03e851423fc74f8095fab42b91387942.png

3.案例引入 

2356252102f8455ca72aaff7e02a3528.png

4e85fee8d8384f3682449e603bc658eb.png

a3477b6d521846b5baa95dae8a0b25fa.png

7c77da222cfb49f4ba589fa8944a89e9.png

8d4a26ea0c2c428b827f299f81d6bf8c.png

15aa876b5e0d4474b13b429cd7194018.png

01d2c5b9d6ab4b6baac21d1cdfe14aa8.png

189901d3c73d447f9a53f1c465a58f46.png

ad586c8cfb944d26af135d7d0edbad73.png

4.栈的表示和操作的实现 

20ec2252eba24e75bc6b4ea05c15b230.png

1d077a5fa9b84b699a43e3ddb335fe2c.png

b0f78a91fe824e2db4db329fa5b99895.png

1b8e35151506471f98efe420d3393089.png

68d0c63c1a2f4035ba9a1053b6be667f.png

8923f58e6f7d49608d66d155e7f4a6a3.png

a5d96e3ad17c4c4e921b6e2e1d1bd80f.png

1.顺序栈的表示 

cedfde1b61c149259e742068b3581df4.png

代码示例:

#define maxsize 100;
typedef struct
{int *base;int *top;int stacksize;
}sqstack;

 

77cd34dee44c469bbcf2ddef46737490.png

2.顺序栈的初始化 

efd3b242780f4aa28129196bf73a4e92.png

代码示例:

int initstack(sqstack &s)
{s.base = new int[100];s.top = s.base;s.stacksize = 100;return 1;
}

3.判断栈是否为空 

f2717311403f4aa7a9b1ff8deba49e13.png

代码示例:

int stackempty(sqstack &s)
{if(s.top == s.base) return true;else return false;
}

4.求顺序栈长度 

0a9a0c8b6d92421ca17e0953646a3e89.png

代码示例:

int stacklength(sqstack &s)
{return s.top - s.base;
}

5.清空顺序栈 

f1bf4873fa0d482ea9b0e828bbb2fdb2.png

代码示例:

int clearstack(sqstack &s)
{if(s.base != NULL) s.top = s.base;return 1;
}

6.销毁顺序栈 

3b404cc107884b39acac57654cbd4c09.png

代码示例:

int destorystack(sqstack &s)
{if(s.base != NULL){delete s.base;s.stacksize = 0;s.base = s.top = NULL;}return 1;
}

7.顺序栈的入栈 

f9e8b2adb3244368a5e0aeec0b229134.png

代码示例:

int push(sqstack &s,int e)
{if(s.top - s.base == s.stacksize)return 0;*s.top = e;s.top++;return 1;
}

8.顺序栈的出栈 

b375fe65d1d8472eb5e4044ffa908ad5.png

代码示例:

int pop(sqstack &s,int &e)
{if(s.top == s.base) return 0;s.top--;e = *s.top;return 1;
}

5.链栈的表示和实现 

31d5d8ccfec84600863598453863006f.png

代码示例:

typedef struct stacknode
{int data;struct stacknode *next;
}stacknode,*linkstack;
linkstack s;

1.链栈的初始化 

bd9fe269c5904e2d938717b2b7689269.png

代码示例:

void initlinkstack(linkstack &s)
{s = NULL;
}

2.判断链栈是否为空 

4ded6a84817a4d688c2f4d5329f5e6e2.png

代码示例:

int stackempty(linkstack s)
{if(s == NULL) return false;else return true;
}

3.链栈的入栈 

2302d1fb3fc042d6b476456c8c5d0368.png

代码示例:

int push(linkstack &s,int e)
{stacknode *p;p = new stacknode;p -> data = e;p -> next = s;s = p;return 1;
}

4.链栈的出栈 

6018b64aa96d43b3a2a97b312d8c5773.png

代码示例:

int pop(linkstack &s,int &e)
{if(s == NULL) return 0;e = s -> data;stacknode *p;p = s;s = s -> next;delete p;return 1;
}

5.取栈顶元素 

3d130ac01bcb4c3583a45d7819eba3b6.png

代码示例:

int gettop(stacknode *s)
{if(s != NULL) return s -> data;
}

6.栈与递归 

8a7b27fc5515481481d97928c0c01f6c.png

4d81056e4fc34888ae9fe6579d1ddc71.png

40f900bbeb854b7da4e79c71de3bba13.png

189d44c42300431985f4861876bc6a09.png

207ffae311164868969efc67fea9d8cd.png

1.递归问题的求法 

271db5da6fdf4e298d3ae4650c836ca5.png

2.递归的定义 

14f3f92deda545cfa0b4ce7b6f884563.png

329669cd8029431e85b0131a1fbf7ce7.png

b072c77b854b424387b251699124b282.png

f78140218ac24fb880d6cafe16fae1ef.png

b8d0ff5de92049fd81e92c1997e119b4.png

56b9b319b8ce48e8aceb772ac927fbf4.png

86fa5f386517491aac69afdb76ae5340.png

3.递归的优缺点 

46d1e9ea2f654d8d94ab777bcd816da2.png

dd111a9e33d94c52b69fe72e89e93bd0.png

48d82c2910904314bf79cbb9e9d50910.png

cd9b120082194947b8ea5038042e9ff6.png

486e4cfbd1ce4a4a916b18902c1bcb7e.png

9188e283cb8641e090ea16242ff801db.png

8611065aa5554c95aa017c5bed39fb49.png

7.队列的表示和操作 

ff68151fc2c045558ac382e9db4194b1.png

651d11520722463e900f9f0b87c631d5.png

67dc1d06a3d64287b8d6b30ee83a2c38.png

a71a5f32fcb64f33a34331d90ab1eb5f.png

1.队列的抽象数据类型定义 

bab86cc1bc2b4fbdb5d8e03210c4f685.png

2.队列的顺序表示和实现 

c5b3de9788c04e31b19033bd35d36b3e.png

代码示例:

#define maxqsize = 100
typedef struct
{int *base;int front;int rear;
}sqqueue;

 

1f0bc88402484f58af5c8571f2108c2d.png

5585b22f3f904d08b782025b09aa86b9.png

3.解决假上溢的办法——循环队列 

fdd83e86f1c74f59b15e024942afffd8.png

dd796b2bace4450d8d24e98c3060db72.png

e79d6071247c4b5892dee7a3b9b5c813.png

b1d4200ed0e244dd99430089bb6c9367.png

320ded398d574e208cd315feb692f60c.png

4.循环队列的类型定义 

07e709266c5443b9a9a4b7158f004402.png

代码示例:

#define maxqsize = 100
typedef struct
{int *base;int front;int rear;
}sqqueue;

5.队列的初始化 

6470440569f14618931c8fe0ac92119d.png

代码示例:

int initqueue(sqqueue &q)
{q.base = new int[100];q.front = q.rear = 0;return 1;
}

6.求队列长度 

18dd178cff3b480a85c0f1a4d9b62cab.png

代码示例:

int queuelength(sqqueue &q)
{return ((q.rear - q.front + maxqsize) % maxqsize);
}

7循环队列入队 

b6fe21e9af5a41bf977509fae30abd35.png

代码示例:

int enqueue(sqqueue &q,int e)
{if((q.rear + 1) % maxqsize == q.front) return 0;q.base[q.rear] = e;q.rear = (q.rear + 1) % maxqsize;return 1;
}

8.循环队列出队 

c31f2b07fe3e467a96593cd72b8b5578.png

代码示例:

int dequeue(sqqueue &q,int &e)
{if(q.front == q.rear) return 0;e = q.base[q.front];q.front = (q.front + 1) % maxqsize;return 1;
}

9.取队头元素 

f1881dc69d964d409bf81f9a49c85c0b.png

代码示例:

int gethead(sqqueue &q)
{if(q.front != q.rear)return q.base[q.front];
}

8.链队列

1.链队的类型定义 

22977415d11e4d5890d4f0bb8a92ade1.png

代码示例:

typedef struct qnode
{int data;struct qnode *next;
}qnode,*queueptr;typedef struct
{queueptr front;queueptr rear;
}linkqueue;

 

6169096bb4774be4924a1027d88802ab.png

2.链队初始化 

51eb86cc622e40d49bfc5aeae02a1963.png

代码示例:

int lnitqueue(linkqueue &q)
{q.front = q.rear = new qnode;q.front -> next = NULL;return 1;
}

3.销毁链队列 

10d31302fe5f4aab8d87e8582cfbf135.png

fceb5c7b88024f35b6ee295f0a03e619.png

代码示例:

int destoryqueue(linkqueue &q)
{while(q.front){queueptr p;p = q.front -> next;delete q.front;q.front = p;}return 1;
}

4.将元素e入队 

b03c7c480b4542f2a5da210c527b2c61.png

代码示例:

int enqueue(linkqueue &q,int e)
{queueptr p;p = new qnode;p -> data = e;p -> next = NULL;q.rear -> next = p;q.rear = p;return 1;
}

5.链队列出队 

54c0d965ac3e431881ba8d5bc613325f.png

b370f9433d38485f8200b538a519158b.png

32bff9d1f35741c8b23e294fbe850fcb.png

代码示例:

int dequeue(linkqueue &q,int &e)
{if(q.front == q.rear) return 0;queueptr p;p = q.front -> next;e = p -> data;q.front -> next = p -> next;if(q.rear == p) q.rear = q.front;delete p;return 1;
}

6.求链队列的队头元素 

5ac2582611254f6592eabb8e197ce530.png

代码示例:

int gethead(linkqueue q,int &e)
{if(q.front == q.rear) return 0;e = q.front -> next -> data;return 1;
}

9.总的代码

#include<bits/stdc++.h>
using namespace std;#define maxsize 100;
typedef struct
{int *base;int *top;int stacksize;
}sqstack;int initstack(sqstack &s)
{s.base = new int[100];s.top = s.base;s.stacksize = 100;return 1;
}int stackempty(sqstack &s)
{if(s.top == s.base) return true;else return false;
}int stacklength(sqstack &s)
{return s.top - s.base;
}int clearstack(sqstack &s)
{if(s.base != NULL) s.top = s.base;return 1;
}int destorystack(sqstack &s)
{if(s.base != NULL){delete s.base;s.stacksize = 0;s.base = s.top = NULL;}return 1;
}int push(sqstack &s,int e)
{if(s.top - s.base == s.stacksize)return 0;*s.top = e;s.top++;return 1;
}int pop(sqstack &s,int &e)
{if(s.top == s.base) return 0;s.top--;e = *s.top;return 1;
}typedef struct stacknode
{int data;struct stacknode *next;
}stacknode,*linkstack;
linkstack s;void initlinkstack(linkstack &s)
{s = NULL;
}int stackempty(linkstack s)
{if(s == NULL) return false;else return true;
}int push(linkstack &s,int e)
{stacknode *p;p = new stacknode;p -> data = e;p -> next = s;s = p;return 1;
}int pop(linkstack &s,int &e)
{if(s == NULL) return 0;e = s -> data;stacknode *p;p = s;s = s -> next;delete p;return 1;
}int gettop(stacknode *s)
{if(s != NULL) return s -> data;
}#define maxqsize = 100
typedef struct
{int *base;int front;int rear;
}sqqueue;int initqueue(sqqueue &q)
{q.base = new int[100];q.front = q.rear = 0;return 1;
}int queuelength(sqqueue &q)
{return ((q.rear - q.front + maxqsize) % maxqsize);
}int enqueue(sqqueue &q,int e)
{if((q.rear + 1) % maxqsize == q.front) return 0;q.base[q.rear] = e;q.rear = (q.rear + 1) % maxqsize;return 1;
}int dequeue(sqqueue &q,int &e)
{if(q.front == q.rear) return 0;e = q.base[q.front];q.front = (q.front + 1) % maxqsize;return 1;
}int gethead(sqqueue &q)
{if(q.front != q.rear)return q.base[q.front];
}typedef struct qnode
{int data;struct qnode *next;
}qnode,*queueptr;typedef struct
{queueptr front;queueptr rear;
}linkqueue;int lnitqueue(linkqueue &q)
{q.front = q.rear = new qnode;q.front -> next = NULL;return 1;
}int destoryqueue(linkqueue &q)
{while(q.front){queueptr p;p = q.front -> next;delete q.front;q.front = p;}return 1;
}int enqueue(linkqueue &q,int e)
{queueptr p;p = new qnode;p -> data = e;p -> next = NULL;q.rear -> next = p;q.rear = p;return 1;
}int dequeue(linkqueue &q,int &e)
{if(q.front == q.rear) return 0;queueptr p;p = q.front -> next;e = p -> data;q.front -> next = p -> next;if(q.rear == p) q.rear = q.front;delete p;return 1;
}int gethead(linkqueue q,int &e)
{if(q.front == q.rear) return 0;e = q.front -> next -> data;return 1;
}int main(){return 0;
}

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

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

相关文章

如何实现图片上传至服务器

在绝大多数的项目中都会涉及到文件上传等&#xff0c;下面我们来说一下技术派中是如何实现原生图片上传的&#xff0c;这个功能说起来简单&#xff0c;但其实对于技术还是有考验的。图片的上传涉及到IO读写&#xff0c;一个文件上传的功能&#xff0c;就可以把IO流涉及到的知识…

✅技术社区—通过Canal框架实现MySQL与ElasticSearch的数据同步

Canal 是一个由阿里巴巴开源的&#xff0c;基于 Java 的数据库变更日志解析的中间件&#xff0c;其原理是基于Binlog订阅的方式实现&#xff0c;模拟一个MySQL Slave 订阅Binlog日志&#xff0c;从而实现CDC&#xff0c;主要用于实现 MySQL 数据库的增量数据同步。它主要的使用…

模块化项目Eclipse测试网零撸教程

简介&#xff1a;Eclipse 是一个基于 Solana 区块链的初创项目&#xff0c;致力于构建基于 Solana 虚拟机的通用 Layer2 解决方案&#xff0c;为以太坊提供更快速、更通用的 Rollup 技术。其主要用途是为开发者提供构建基于 Solana 虚拟机的 Rollup 应用的平台&#xff0c;解决…

Vue3-响应式基础:单文件和组合式文件

单文件&#xff1a;html <!DOCTYPE html> <html> <head><title>响应式基础</title> </head> <body><div id"app" ><!-- dynamic parameter:同样在指令参数上也可以使用一个 JavaScript 表达式&#xff0c;需要包…

SpringBoot(整合MyBatis + MyBatis-Plus + MyBatisX插件使用)

文章目录 1.整合MyBatis1.需求分析2.数据库表设计3.数据库环境配置1.新建maven项目2.pom.xml 引入依赖3.application.yml 配置数据源4.Application.java 编写启动类5.测试6.配置类切换druid数据源7.测试数据源是否成功切换 4.Mybatis基础配置1.编写映射表的bean2.MonsterMapper…

从零到一构建短链接系统(五)

1.修改UserService Service public class UserServiceImpl extends ServiceImpl<UserMapper, UserDO> implements UserService {public UserRespDTO getUserByUsername(String username) {LambdaQueryWrapper<UserDO> queryWrapper Wrappers.lambdaQuery(UserDO.c…

MySQL实战:监控

监控指标 性能类指标 名称说明QPS数据库每秒处理的请求数量TPS数据库每秒处理的事务数量并发数数据库实例当前并行处理的会话数量连接数连接到数据库会话的数量缓存命中率Innodb的缓存命中率 功能类指标 名称说明可用性数据库是否正常对外提供服务阻塞当前是否有阻塞的会话…

HarmonyOS-鸿蒙系统概述

你了解鸿蒙系统吗&#xff1f; 你看好鸿蒙系统吗&#xff1f; 今年秋季即将推出的HarmonyOS Next 星河版热度空前&#xff0c;一起来了解一下吧。本文将从HarmonyOS 的应用场景、发展历程、架构、开发语言、开发工具、生态建设六个角度聊一聊个人的理解。 1、应用场景 鸿蒙…

深度学习pytorch——拼接与拆分(持续更新)

cat拼接 使用条件&#xff1a;合并的dim的size可以不同&#xff0c;但是其它的dim的size必须相同。 语法&#xff1a;cat([tensor1,tensor2],dim n) # 将tensor1和tensor2的第n个维度合并 代码演示&#xff1a; # 拼接与拆分 a torch.rand(4,32,8) b torch.rand(…

多线程JUC 第2季 wait和notify唤醒机制

一 wait和notify的区别与相同 1.1 wait和notify的作用 1) 使用wait()、notify()和notifyAII()时需要先对调用对象加锁。否则直接调用的话会抛出 IllegalMonitorStateExceptiona。 2) 调用wait()方法后&#xff0c;线程状态。由RUNNING变为WAITING&#xff0c;并将当前线程放置…

【LabVIEW FPGA入门】流水线

LabVIEW中流水线 在当今多核处理器和多线程应用程序的世界中&#xff0c;程序员在开发应用程序时需要不断思考如何最好地利用尖端 CPU 的强大功能。尽管用传统的基于文本的语言构建并行代码可能难以编程和可视化&#xff0c;但 NI LabVIEW 等图形开发环境越来越多地允许工程师和…

【Docker】一文趣谈Docker

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》《项目实战》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 …

ELK日志管理实现的3种常见方法

ELK日志管理实现的3种常见方法 1. 日志收集方法 1.1 使用DaemonSet方式日志收集 通过将node节点的/var/log/pods目录挂载给以DaemonSet方式部署的logstash来读取容器日志,并将日志吐给kafka并分布写入Zookeeper数据库.再使用logstash将Zookeeper中的数据写入ES,并通过kibana…

第七节:Vben Admin权限-后端获取路由和菜单

系列文章目录 第一节:Vben Admin介绍和初次运行 第二节:Vben Admin 登录逻辑梳理和对接后端准备 第三节:Vben Admin登录对接后端login接口 第四节:Vben Admin登录对接后端getUserInfo接口 第五节:Vben Admin权限-前端控制方式 第六节:Vben Admin权限-后端控制方式 第七节…

PHP魔术方法详解

php魔术方法是一些特殊的方法&#xff0c;由特定的环境来进行触发。 这些魔术方法让开发者能够更好地控制对象的行为&#xff0c;特别是在处理不常见的操作或者需要自动化处理某些任务时非常有用。 1、_construct()构造函数&#xff1a; <?php highlight_file(__FILE__);…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:SideBarContainer)

提供侧边栏可以显示和隐藏的侧边栏容器&#xff0c;通过子组件定义侧边栏和内容区&#xff0c;第一个子组件表示侧边栏&#xff0c;第二个子组件表示内容区。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起…

《LeetCode热题100》笔记题解思路技巧优化_Part_4

《LeetCode热题100》笔记&题解&思路&技巧&优化_Part_4 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题二叉树&#x1f7e2;1. 二叉树的中序遍历&#x1f7e2;2.…

【计算机网络_应用层】https协议——加密和窃密的攻防

文章目录 1.https协议的介绍2. 加密和解密2.1 什么是加密2.2 常见的加密方式2.2.1 对称加密2.2.2 非对称加密 2.3 数据摘要&#xff08;数据指纹&#xff09;2.4 数字签名 3. https协议的加密和解密方案一&#xff1a;使用对称加密&#xff08;❌&#xff09;方案二&#xff1a…

Cesium模拟真实湖泊效果

1. 实现效果 2.实现方法 官方文档 Cesium的material中提供了水water的相关材质&#xff1a;传送门 详细代码&#xff1a; const getWater (data) > {// 根据几何实例创建贴地面图元waterPrimitive new Cesium.GroundPrimitive({geometryInstances: new Cesium.GeometryIn…

2024年腾讯云免费服务器申请入口,个人和企业均可申请

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…