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

目录

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流涉及到的知识…

PyTorch学习笔记之激活函数篇(六)

6、RReLU函数 对应的论文链接&#xff1a;https://arxiv.org/pdf/1505.00853.pdf 6.1 公式 RReLU函数的公式&#xff1a; f ( x ) { x , x > 0 α x , x < 0 f(x) \begin{cases} x&,x>0 \\ \alpha x&,x<0 \end{cases} f(x){xαx​,x>0,x<0​ …

rust - 一个日志缓存记录的通用实现

本文给出了一个通用的设计模式&#xff0c;通过建造者模式实例化记录对象&#xff0c;可自定义格式化器将实例化后的记录对象写入到指定的缓存对象中。 定义记录对象 use chrono::prelude::*; use std::{cell::RefCell, ffi::OsStr, fmt, io, io::Write, path::Path, rc::Rc,…

✅技术社区—通过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;需要包…

企业微信H5文件下载。

废话不多说&#xff0c;直接上代码。 1.判断是不是企业微信打开的 const ua navigator.userAgent.toLowerCase() if (/micromessenger/.test(ua)) {} 2.复制功能 navigator.clipboard.writeText(newsUrl).then(() > {this.$message({message: 您已复制文件链接&#xff…

leetcode513找树左下角的值

解法1&#xff1a;BFS 思路就是层序遍历 用队列记住每层的元素&#xff0c;如果每次记住每层的第一个元素 ---->https://programmercarl.com/0102.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86.html#_102-%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A…

微调大型语言模型(LLM):应用案例示例

微调大型语言模型&#xff08;LLM&#xff09;&#xff1a;应用案例示例 摘要&#xff1a; 本文讨论了大型语言模型&#xff08;LLM&#xff09;的微调&#xff0c;这是一种通过少量数据训练已经预训练好的模型以执行特定任务的过程。微调可以让LLM在翻译、文本分类、文本生成…

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、应用场景 鸿蒙…

Sora提示词与视频创作的融合(一):创意启发:利用提示词激发创作灵感

在Sora模型的创作中&#xff0c;利用提示词激发创作灵感是一个至关重要的环节。提示词作为引导模型生成视频内容的关键因素&#xff0c;不仅能够指导模型按照特定的主题和风格生成内容&#xff0c;还能够激发创作者的灵感&#xff0c;推动创意的产生。下面将详细探讨如何利用提…

深度学习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;并将当前线程放置…

无人机是如何进行开发的

无人机开发涉及多个方面&#xff0c;包括硬件设计、软件开发、飞行控制算法等。以下是一个简化的无人机方案开发流程&#xff1a; 需求分析&#xff1a;明确无人机的功能、性能要求和应用场景。硬件选择&#xff1a;选择合适的飞控系统、传感器&#xff08;如陀螺仪、加速度计…

Runnable 和 Callable 的区别?什么是 Callable 和 Future?什么是 FutureTask?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 Runnable 和 Callable 的区别 Runnable接口适用于那些不需要返回结果的任务,而Callable接口适用于需要返回结果的任务,并且可以抛出受检异常。Runnable接…

【LabVIEW FPGA入门】流水线

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

【Docker】一文趣谈Docker

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