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

news2024/12/31 6:12:11

目录

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.coloradmin.cn/o/1541016.html

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

相关文章

官宣|阿里巴巴捐赠的 Flink CDC 项目正式加入 Apache 基金会

摘要&#xff1a;本文整理自阿里云开源大数据平台徐榜江 (雪尽)&#xff0c;关于阿里巴巴捐赠的 Flink CDC 项目正式加入 Apache 基金会&#xff0c;内容主要分为以下四部分&#xff1a; 1、Flink CDC 新仓库&#xff0c;新流程 2、Flink CDC 新定位&#xff0c;新玩法 3、Flin…

taro框架之taro-ui中AtSwipeAction的使用

题记&#xff1a;所需效果&#xff1a;滑动删除 工作进程 官网文档代码 <AtSwipeAction options{[{text: 取消,style: {backgroundColor: #6190E8}},{text: 确认,style: {backgroundColor: #FF4949}} ]}><View classNamenormal>AtSwipeAction 一般使用场景</…

Vue 3 里的 onMounted 怎么用?

疑问 最近&#xff0c;一直在学习 Vue 3&#xff0c;此前我不懂前端&#xff0c;也没写过 Vue 2&#xff0c;所以是从 0 开始学习 Vue 3 的。很多对普通人不是疑问的&#xff0c;在我这里也会不太清楚。 我在写项目的时候&#xff0c;常见的一种场景是这样的&#xff1a;页面…

Excel通过下拉菜单,显示不同图片

背景&#xff1a;有的时候需要通过更改下拉菜单来改变对应的 值/ 图片。 如果是数值的话就是我们常常用的Vlookup&#xff0c;这个可以很简单的实现这个功能。&#xff08;这个如果不知道请自行百度&#xff09; 但是如果是图片呢&#xff1f;这个就不常见了&#xff0c;那么…

41 物体检测和目标检测数据集【李沐动手学深度学习v2课程笔记】

目录 1. 物体检测 2. 边缘框实现 3.数据集 4. 小结 1. 物体检测 2. 边缘框实现 %matplotlib inline import torch from d2l import torch as d2ld2l.set_figsize() img d2l.plt.imread(../img/catdog.jpg) d2l.plt.imshow(img);#save def box_corner_to_center(boxes):&q…

企业计算机服务器中了mkp勒索病毒怎么办,mkp勒索病毒解密流程步骤

在网络技术飞速发展的今天&#xff0c;越来越多的企业走向了数字化办公模式&#xff0c;网络为企业的生产运营提高了效率&#xff0c;为企业带来了极大便利&#xff0c;但网络是一把双刃剑&#xff0c;在为人们提供便利的同时也会带来数据安全问题&#xff0c;网络数据安全一直…

NFS网络文件系统

目录 简介 案例 配置autofs自动挂载 客户端配置autofs 简介 NFS&#xff08;Network File System&#xff0c;网络文件系统&#xff09;是FreeBSD支持的文件系统中的一种&#xff0c;它允许网络中的计算机&#xff08;不同的计算机、不同的操作系统&#xff09;之间通过TCP/I…

每日一题 --- 螺旋矩阵 II[力扣][Go]

螺旋矩阵 II 题目&#xff1a;59. 螺旋矩阵 II - 力扣&#xff08;LeetCode&#xff09; 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出…

vulhub打靶记录——cengbox

文章目录 主机发现端口扫描搜索SSH EXPweb渗透nikto扫描目录扫描登录网站后台提权 主机发现 使用nmap扫描局域网内存活的主机&#xff0c;命令如下&#xff1a; nmap -sP 192.168.56.0/24192.168.56.1&#xff1a;主机IP&#xff1b;192.168.56.100&#xff1a;DHCP服务器IP&…

SpringCloud-Gateway服务网关

一、网关介绍 1. 为什么需要网关 Gateway网关是我们服务的守门神&#xff0c;所有微服务的统一入口。 网关的核心功能特性&#xff1a; 请求路由 权限控制 限流 架构图&#xff1a; 权限控制&#xff1a;网关作为微服务入口&#xff0c;需要校验用户是是否有请求资格&am…

windows 系统下(nacos1.x) nacos-1.1.3 链接数据库 mysql8.0 出错分析

** windows 系统下&#xff08;nacos1.x&#xff09; nacos-1.1.3 链接数据库 mysql8.0 出错分析 ** 1、首先以下方法亲测无效&#xff1a; 1&#xff09;需要在数据库 URL 链接配置信息中 添加 allowPublicKeyRetrievaltrue 无效 db.url.0**&allowPublicKeyRetrievalt…

基于python+vue城市交通管理系统的设计与实现flask-django-php-nodejs

此系统设计主要采用的是python语言来进行开发&#xff0c;采用django/flask框架技术&#xff0c;框架分为三层&#xff0c;分别是控制层Controller&#xff0c;业务处理层Service&#xff0c;持久层dao&#xff0c;能够采用多层次管理开发&#xff0c;对于各个模块设计制作有一…

正弦实时数据库(SinRTDB)简介

正弦实时数据库是长沙巨松软件科技有限公司为了解决工业传感器产生的海量数值型数据的存储、计算等需求而研发的产品。广泛应用于电力、冶金、石油、化工、燃气等多个领域。 正弦实时数据库的主要特点如下&#xff1a; 性能 单机支持管理一百万标签点。单机支持并发用户数超…

【理解机器学习算法】之Clustering算法(K-Means)

实现 K-means 聚类从零开始涉及几个关键步骤&#xff1a;初始化质心、将点分配给最近的质心、根据分配更新质心&#xff0c;以及重复这个过程直到收敛。这里是一个基本的 Python 实现&#xff1a; K-means 算法步骤&#xff1a; 初始化质心&#xff1a;从数据点中随机选择 k …

走迷宫----bfs再矩阵图里的应用模版

对于之前走迷宫的那个题 回忆一下dfs的代码 #include <bits/stdc.h> using namespace std; int a[110][110]; bool check[110][110]; int n,m; int ans1e9; int nxt[4][2]{{1,0},{0,-1},{-1,0},{0,1}}; void dfs(int x,int y,int step){if(xn&&ym){ansmin(ans,…

linux系统------------Mysql数据库介绍、编译安装

目录 一、数据库基本概念 1.1数据(Data) 1.2表 1.3数据库 1.4数据库管理系统(DBMS) 数据库管理系统DBMS原理 1.5数据库系统&#xff08;DBS) 二、数据库发展史 1、第一代数据库 2、第二代数据库 3、第三代数据库 三、关系型数据库 3.1关系型数据库应用 3.2主流的…

sqlalchemy和moke生成实体类(一)

前言 如果通过java生成实体类&#xff0c;可以通过mybatis或者mybatis-plus的generator。 而sqlalchemy也可以生成实体类&#xff0c;通过sqlalcodegen或者flask-sqlalcodegen。 使用flask-sqlalcodegen生成实体类 建表 建立学生表&#xff0c;如下。 create table stude…

Web前端全栈HTML5通向大神之路

本套课程共三大阶段&#xff0c;六大部分&#xff0c;是WEB前端、混合开发与全栈开发必须要掌握的技能&#xff0c;从基础到实践&#xff0c;是从编程小白成长为全栈大神的最佳教程&#xff01; 链接&#xff1a;https://pan.baidu.com/s/1S_8DCORz0N2ZCdtJg0gHsw?pwdtjyv 提取…

minio基本使用

直接docker润起来&#xff08;其实是我用服务器运行一早上&#xff0c;没成功.......................&#xff09; docker run \-p 9000:9000 \-p 9001:9001 \--user $(id -u):$(id -g) \--name minio1 \-e "MINIO_ROOT_USERROOTUSER" \-e "MINIO_ROOT_PASSWOR…

☆【前后缀】【双指针】Leetcode 42. 接雨水

【前后缀】【双指针】Leetcode 42. 接雨水 解法1 前后缀分解解法2 双指针 ---------------&#x1f388;&#x1f388;42. 接雨水 题目链接&#x1f388;&#x1f388;------------------- 解法1 前后缀分解 维护一个前缀&#xff08;左侧最高&#xff09;后缀&#xff08;右侧…