数据结构--栈与队列【您的关注是我创作的动力!】

文章目录

    • 什么是栈?
    • 栈的具体实现
  • 队列
    • 什么是队列?
    • 队列的实现


什么是栈?

栈也是顺序表的一种,栈的逻辑实现是先进后出(后进先出)就跟子弹夹一样。
具体逻辑就是它只允许在固定的一端进行数据的插入与删除,在数据插入与删除的一端称为
栈顶,另一端称为栈低
压栈:插入数据的名称,在栈顶插入数据
出栈:删除数据的名称,   在栈顶删除数据

如图:
在这里插入图片描述

栈的具体实现

我们可以用双链表,单链表,数组来实现栈,
本文采用数组来实现栈,因为双链表的指针太多,浪费,单链表每次创建节点都需要去用操作系统
也是比较浪费资源。

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdlib.h> //用于引用动态内存函数
#include<stdbool.h>//用于使用布尔类型
#include<assert.h>
typedef int Datatype;
typedef struct Stack {

	Datatype* arr;   //定义数组来实现栈。那么进栈与出栈的操作用尾插与尾删实现
	int capacity;   //已经申请的空间
	int top;       //用top的数值代表栈顶指针,指向第几个元素
}ST;
//栈的初始化
void StackInitialize(ST* p);
//判断空间是否足够,不够则扩容
void Deter(ST* p);
//进栈
void StackInsert(ST* p, Datatype x);
//出栈
void StackDelete(ST* p);
//返回栈顶的元素
Datatype StackTop(ST* p);
//求栈中元素的个数
int StackSize(ST* p);
//判断栈是否为空
bool StackEmpty(ST* p);
//栈的销毁
void StackDestory(ST* p);

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"
//栈的初始化
void StackInitialize(ST*p) {
	//将栈的空间初始置为4个元素的大小
	p->arr = (Datatype *)malloc(4 * sizeof(Datatype));
	//栈的初始元素个数为0
	p->top = 0; //top的初始值为0代表,表示栈顶指针指向栈顶元素的下一个元素
	                              //这个栈顶指针的理解可以从p->size元素个数的角度理解
	                              //p-size-1就相当于栈顶指针指向的元素位置,p->size即元素的总个数
	 //因为top代表栈顶指针指向栈顶的下一个元素,所以可以使用top-1来表示栈顶元素
	 // 但是top为0时,则代表栈中没有元素,top-1也不能使用!                        
	p->capacity = 4;//初始化的空间为4个数据类型大小的空间
}
//判断空间是否足够,不够则扩容
void Deter(ST* p) {
	//判断空间是否足够,要看元素个数与空间个数是否相同
	//如果相同,则空间不足
	assert(p);
	if (p->top == p->capacity) {
		Datatype* p1 = realloc(p->arr, 2 * p->capacity * sizeof(Datatype));
		//如果扩展空间失败
		if (p1 == NULL) {
			printf("扩展空间失败\n");
		}
		//如果扩展空间成功,
		else {
			p->arr = p1;
			p->capacity = 2 * p->capacity;//记录增长二倍

		}

	}
}
//进栈
void StackInsert(ST*p,Datatype x) {
	assert(p);
       //先判断空间是否足够,如果不足,则扩容
	Deter(p);
	//从数组的尾部插入数据实现进栈
	p->arr[p->top++] = x;

}
//出栈
void StackDelete(ST*p) {
	assert(p);
	//如果栈已经为空,还删除栈中内容则报错!
	assert(p->top > 0);
	p->top--;
}
//返回栈顶的元素
Datatype StackTop(ST *p) {
	assert(p);
	assert(p->top > 0);//栈不能为空,否则报错
	return p->arr[p->top - 1];
}
//求栈中元素的个数
int StackSize(ST*p) {
	assert(p);
	return p->top;
}
//判断栈是否为空
bool StackEmpty(ST*p) {
	assert(p);
	//查询栈中元素的个数即可
	if (p->top == 0) {
		//false表示为空
		return false;
	}
	else {
		return true;
	}
}
//栈的销毁
void StackDestory(ST *p) {
	assert(p);
	//栈的销毁需要先释放掉申请的空间
	free(p->arr);
	p->arr = NULL;
	p->top = p->capacity = 0;
}

队列

什么是队列?

队列也是线性表的一种,它的规则是只能在队列的一端插入数据,在另一端删除数   据,简称为:先进先出
出队列:进入数据删除的一端称为队头
入队列:进行数据插入的一端称为队尾

在这里插入图片描述

队列的实现

队列可以由数组,单链表,与双链表实现,
数组实现时,如果删除数据后,还需再挪动整个队列中的数据移动
双链表的指针太多,
所以我采用单链表:
进行尾插与头删
在这里插入图片描述

#pragma once  //用于避免头文件被重复引用
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
//定义存储的数据类型
typedef int Datatype; 

//用单链表来实现队列
typedef struct QueueNode {
	  
	Datatype data;
	struct QueueNode* Next;
}QN;
//初始化队列:
//因为要改变头指针,所以需要用二级指针
void QueueInitialize(QN** pphead);
//队尾入
//采用尾插法来实现
void QueueInsert(QN* phead, Datatype x);
//队头出
//出队列的实现用头删法
//因为头指针需要改变,所以用二级指针作为形参
void QueueDelete(QN** pphead);
//获取队头的数据
Datatype QueueFront(QN* phead);
//获取队尾的数据
Datatype QueueTail(QN* phead);
//获取队列中元素的个数
int QueueSize(QN* phead);
//判断队列是否为空
bool QueueEmpty(QN* phead);
//销毁队列
void QueueDestory(QN** phead);

在这里插入图片描述

#include"Queue.h"
//初始化队列:
//因为要改变头指针,所以需要用二级指针
void QueueInitialize(QN**pphead) {
	*pphead = NULL;
}
//队尾入
//采用尾插法来实现
void QueueInsert(QN*phead,Datatype x) {
	//先找到队尾
	QN* temp = phead;
	while (temp!= NULL) {
		
		temp = temp->Next;
	}
	temp = (QN*) malloc (sizeof(QN)); //创建一个新节点
	temp->data = x; //赋值
	temp->Next = NULL;

}
//队头出
//出队列的实现用头删法
//因为头指针需要改变,所以用二级指针作为形参
void QueueDelete(QN**pphead) {
	//头删时,首节点不能为空
	assert(*pphead&&pphead);
	QN* tem = *pphead;
	*pphead = (*pphead)->Next;//将头指针指向第二个节点
	free(tem); //释放掉tem中指针指向的空间
}
//获取队头的数据
Datatype QueueFront(QN *phead) {
	assert(phead); //phead不能为空。
	return phead->data;
}
//获取队尾的数据
Datatype QueueTail(QN* phead) {
	assert(phead);
	QN* tem = phead;
	while (tem->Next!=NULL) {
		tem = tem->Next;
	}
	//找到尾节点后
	return tem->data;
}
//获取队列中元素的个数
int QueueSize(QN*phead) {
	int size = 0;
	QN* tem = phead;
	while (tem != NULL) {
		tem = tem->Next;
		size++;
	}
	return size;
}
//判断队列是否为空
bool QueueEmpty(QN*phead) {
	//如果队列为空,返回true
	if (phead == NULL)
		return true;
	//如果队列不为空,返回false
	else
		return false;
}
//销毁队列
void QueueDestory(QN **phead) {
	assert(*phead&&phead);
     //销毁队列从头节点开始释放
	QN* tem = *phead;
	//当前节点不为空,就一直执行
	while (tem != NULL) {
		//先将现在节点的下一个节点地址放在cur变量中
		QN* cur = tem->Next;
		free(tem);
		tem = cur;
	 }
	*phead = NULL;
}

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

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

相关文章

eNSP-抓包解析HTTP、FTP、DNS协议

一、环境搭建 1.http服务器搭建 2.FTP服务器搭建 3.DNS服务器搭建 二、抓包 三、http协议 1.HTTP协议&#xff0c;建立在FTP协议之上 2.http请求 3.http响应 请求响应报文参考&#xff1a;https://it-chengzi.blog.csdn.net/article/details/113809803 4.浏览器开发者工具抓包…

C++ 函数 参数与返回值

#一 参数与返回值 回顾文件读数据功能 文件读数据 1函数参数传值调用过程 将函数调用语句中的实参的一份副本传给函数的型材。 简单的值的传递&#xff0c;实参的值没有发生变化。 2 函数参数传值调用过程 传地址调用 将变量的地址传递给函数的形参 形参和实参指向了同…

webpack与vite

webpack 使用步骤&#xff1a; 初始化项目 pnpm init -y安装依赖webpack、webpack-cli在项目中创建src目录&#xff0c;然后编写代码&#xff08;index.js&#xff09;执行pnpm weboack来对代码进行打包&#xff08;打包后观察dist文件夹&#xff09; 配置古文件&#xff08;w…

数智新重庆 | 推进信号升格 打造算力山城

2024年&#xff0c;是实现“十四五”规划目标任务的关键一年&#xff0c;高质量的5G网络、强大的AI能力作为新质生产力的重要组成部分&#xff0c;将有效赋能包括制造业在内的千行万业数字化化、智能化、绿色化转型升级&#xff0c;推动融合应用新业态、新模式蓬勃兴起&#xf…

字符函数与字符串函数(2)

遇见她如春水映莲花 字符函数与字符串函数&#xff08;2&#xff09; 前言一、strcatstrncat 二、strcmpstrncmp在这里插入图片描述 三、strstr四、strtok五、strerror总结 前言 根据上期字符函数与字符串函数我们可以了解到字符函数与个别字符串函数的用法&#xff0c; 那么接…

SQL注入less-1

一、启动SQL注入的靶场 1、启动phpstudy 注&#xff1a;phpstudy默认的php版本为7.x&#xff0c;想要成功的搭建靶场&#xff0c;需要把php版本改为5.x 2、输入127地址加文件名 进入此界面后点击setup就行 3、进入less-1的关卡 靶场搭建成功 二、查看less-1的代码 注&#…

什么?300TB SSD要来了?

SK海力士在韩国首尔的一场新闻发布会上宣布&#xff0c;其正在研发一款前所未有的300TB容量的固态硬盘&#xff08;SSD&#xff09;。这款硬盘的预告是该公司一系列旨在推动数据中心和设备端AI能力发展的产品与技术组合的一部分。SK海力士引用市场研究预测&#xff0c;全球在AI…

每日一题(力扣740):删除并获得点数--dp+思维

其实跟打家劫舍没啥区别 排序去重之后去考虑当前位置和前两个位置之间的关系即可&#xff0c;具体见代码&#xff1a; class Solution { public:int deleteAndEarn(vector<int>& nums) {int n nums.size();if (n 1) return nums[0];unordered_map<int, int>…

代码随想录算法训练营DAY51|C++动态规划Part12|1143.最长公共子序列、1035.不相交的线、53.最大子序列和

文章目录 1143.最长公共子序列思路CPP代码 1035.不相交的线53.最大子序列和思路CPP代码 1143.最长公共子序列 力扣题目链接 文章讲解&#xff1a;1143.最长公共子序列 视频讲解&#xff1a;动态规划子序列问题经典题目 | LeetCode&#xff1a;1143.最长公共子序列 本题其实就跟…

GPU虚拟化和算力隔离探讨

1. 术语介绍 术语 全称 说明 GPU Graphics Processing Unit 显卡 CUDA Compute Unified Device Architecture 英伟达2006年推出的计算API VT/VT-x/VT-d Intel Virtualization Technology -x表示x86 CPU&#xff0c;-d表示Device SVM AMD Secure Virtual Machine …

ASP.NET视频点播系统的设计与实现

摘 要 本文阐述了基于WEB的交互式视频点播系统的协议原理、软件结构和设计实现。本视频点播系统根据流媒体传输原理&#xff0c;在校园局域网的基础上模拟基于Web的视频点播系统&#xff0c;实现用户信息管理、视频文件的添加、删除、修改及在线播放和搜索功能。本系统是一个…

6.块元素和行内元素

块元素 无论内容多少&#xff0c;该元素独占一行(p、 h1-h6…) 例子如下图 行内元素 内容撑开宽度&#xff0c;左右都是行内元素的可以排在一排(a、 strong、 em …) 例子如下 感谢您的观看&#xff0c;能和您一起学习是我最大的荣幸&#xff01; 文章学习资料&#xff1a;…

【快速入门Linux】10_Linux命令—Vi编辑器

文章目录 一、vi 简介1.1 vi1.2 vim1.3查询软连接命令&#xff08;知道&#xff09; 二、打开和新建文件&#xff08;重点&#xff09;2.1 打开文件并且定位行2.2 异常处理 三、vi三种工作模式&#xff08;重点&#xff09;3.1 末行模式-命令 四、常用命令4.0 命令线路图4.1 移…

url对象---了解url的结构

什么是url url是网页网页的地址&#xff0c;通过一个url我们可以访问到网页&#xff0c;同时url也可以用来引用文件(txt,json,jpg,js,css,html)&#xff0c;所以你可以理解成url是一个指示器&#xff0c;它可以指向一个文件&#xff0c;网页&#xff0c;图片&#xff0c;或者音…

《网络安全技术 网络安全众测服务要求》

近日&#xff0c;全国网络安全标准化技术委员会发布《网络安全技术 网络安全众测服务要求》&#xff08;GB/T 43741-2024&#xff0c;以下简称“众测服务要求”&#xff09;&#xff0c;并将在2024年11月1日正式实施。 《众测服务要求》确立了网络安全众测服务的角色及其职责&…

【skill】移动云服务器80端口

上个月玩CentOS7&#xff0c;提到alist端口问题&#xff0c;https://www.bilibili.com/read/cv33662501/ 云服务器不能被外网访问的原因 1 云服务器没放行端口 2 防火墙没放行端口 3 配置了端口转发 4 浏览器不支持搭建的网页 5 端口被其他软件占用 移动10086云服务的80端口…

ubuntu ros noetic 编译 ORB_SLAM2 过程记录

1. 连接 eigen库 sudo ln -s /usr/include/eigen3/Eigen /usr/include/Eigen 2. opencvx 修改 CMakeList.txt 中的 find_package open cv版本 修改 include/orbExtracter.h 文件为&#xff1a; //#include <opencv2/opencv.hpp> #include<opencv2/imgproc/imgpro…

用魔法打败魔法:用360解除chrome浏览器的360主页

面临的问题&#xff1a; 试了108种方法都是不好使的。 后来看到&#xff1a; https://blog.csdn.net/qq_30267617/article/details/120373704 的介绍&#xff0c;发现可以呀。 三个步骤 步骤1 单击“功能大全” 步骤2 单击“主页防护” 步骤3 在这里更改。

数组不为人知的一面,sizeof与strlen的区分

数组有另外一种表达方式&#xff0c;接下来我用代码的形式展现出来&#xff1a; sizeof 是一个操作符。 是用来计算变量&#xff08;类型&#xff09;所占内存空间大小&#xff0c;不关注内存中存放的具体内容。 单位是字节。 strlen 是一个库函数&#xff0c;是专门求字符…

【计算机毕业设计】基于SpringBoot+Vue智能停车计费系统设计与实现

目录 一、项目介绍 二、项目主要技术 三、系统功能结构设计 四、系统详细功能的实现 4.1 前台功能实现 4.2 管理员模块实现 4.3 用户后台模块实现 五、实现代码 一、项目介绍 该系统采用了java技术、SpringBoot 框架&#xff0c;连接MySQL数据库&#xff0c;具有较高…