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

文章目录

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


什么是栈?

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

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

栈的具体实现

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

在这里插入图片描述

#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));//栈的初始元素个数为0p->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) {//如果队列为空,返回trueif (phead == NULL)return true;//如果队列不为空,返回falseelsereturn 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;
}

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

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

相关文章

小程序使用阿里巴巴矢量图标库

一、登录官网 www.iconfont.cn 二、在搜索框中搜索想要的图标&#xff0c;将鼠标移动到图标上会看到三个标记 可以使用下载&#xff0c;直接使用&#xff1a; 可以使用css文件使用&#xff1a; 首先点击购物车样式的选项&#xff0c;而后点击下图位置&#xff1a; 点击自己创…

成都农商银行2024春季校园招聘考试流程及及校招笔试需要重点考察什么?

成都农商银行校招笔试开摄像头吗&#xff1f; 提前模拟&#xff0c;检查好摄像头 成都农商银行校招笔试真题及题型&#xff1f; 成都农商银行校招使用的是智鼎测评题库&#xff0c;前尘无忧考试系统 34、目前&#xff0c;水和肥料都没有在农业中得到最佳使用&#xff0c;传统的…

【pycharm】调试模式中四个常用按钮介绍

【pycharm】调试模式中四个常用按钮介绍 在 PyCharm 的调试模式中&#xff0c;有四个常用的按钮&#xff0c;它们的功能如下&#xff1a; Step Over (F8)&#xff1a;单步执行&#xff0c;但在遇到函数调用时&#xff0c;不会进入函数内部&#xff0c;而是将整个函数作为一步执…

【每日算法】理论:深度学习基础 刷题:KMP算法思想

上期文章 【每日算法】理论&#xff1a;常见网络架构 刷题&#xff1a;力扣字符串回顾 文章目录 上期文章一、上期问题二、本期理论问题1、注意力机制2、BatchNorm 和 LayerNorm 的区别3、Bert 的参数量是怎么决定的。4、为什么现在的大语言模型都采用Decoder only架构&#x…

掌握TypeScript,成为前端高手(AI写作一键生成免费)

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

playwright 使用

pip install playwright 是一个命令&#xff0c;用于通过 Python 的包管理工具 pip 安装 Playwright 库。Playwright 是一个用于端到端网页测试的库&#xff0c;支持多种浏览器&#xff0c;包括 Chromium、Firefox 和 WebKit。 执行 pip install playwright 命令后&#xff0c…

【数据结构】stack queue —— 栈和队列

前言 这阵子一直在学数据结构&#xff0c;知识点消化地有点慢导致博客一直没写&#xff0c;现在总算是有时间歇下来补补前面落下的博客了。从现在起恢复周更&#xff0c;努努力一周两篇也不是梦……闲话少说&#xff0c;今天就让我们一起来认识栈和队列 1. 栈的介绍和使用 栈…

网络安全实训Day15

写在前面 电子垃圾&#xff0c;堂堂恢复连载。本来不想分天数梳理了&#xff0c;但是最后要写实训报告&#xff0c;报告里还要有实训日记记录每日学的东西&#xff0c;干脆发这里留个档&#xff0c;到时候写报告提供一个思路。 网络空间安全实训-渗透测试 渗透测试概述 定义 一…

粘合/胶合/粘接/聚酰亚胺PI材料使用UV胶,具有高强度粘接的优势,这一点具体要如何操作?(三十五)

前面文章说明使用UV胶粘合聚酰亚胺PI材料时&#xff0c;有一点优势是&#xff1a;具有高强度粘接&#xff0c;UV胶粘剂对聚酰亚胺PI材料具有良好的附着性&#xff0c;能够提供高强度的粘接。这对于需要承受重负载或高应力的应用来说尤为重要。 这一点提到UV胶在粘合聚酰亚胺&am…

MVP+敏捷开发

MVP敏捷开发 1. 什么是敏捷开发&#xff1f; 敏捷开发是一种软件开发方法论&#xff0c;旨在通过迭代、自组织的团队和持续反馈&#xff0c;快速响应需求变化并交付高质量的软件。相较于传统的瀑布模型&#xff0c;敏捷开发强调灵活性、适应性和与客户的紧密合作。敏捷开发方…

关于权限的设计

首先系统权限&#xff0c;每个账号登录后&#xff0c;都需要知道这个账号允许访问哪些api&#xff0c;哪些数据权限&#xff08;一般是指其他账号的一些数据&#xff09; 这里就需要通过角色来关联。 --1.角色绑定菜单&#xff0c;每个菜单设计的时候包含了这个菜单会用到的所…

Docker共享Nginx配置文件

先去一个容器中&#xff0c;找到Nginx.conf配置文件的目录 去创建一个容器&#xff0c;将容器中存放nginx.conf的目录挂载到宿主机存放nginx.conf目录上 去宿主机中找到nginx/html/index.html目录位置 进入宿主机的index.html中修改页面内容 curl 192.168.91.106访问一下 进入…