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

文章目录

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


什么是栈?

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

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

栈的具体实现

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

在这里插入图片描述

#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.mzph.cn/web/6246.shtml

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

相关文章

PHP源码_最新Ai对话系统网站源码 ChatGPT+搭建教程+前后端

基于ChatGPT开发的一个人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过学习和理解人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&#xff0c;真正像人类一样来聊天交流&#xff0c;甚至能完成撰写邮件、视频脚本、文案、翻译、代码&#xff0c;写论…

【KTips】在Kotlin中实现一个十分简单的自循环状态机

在平日的编码生活中&#xff0c;你有没有遇到过需要通过状态机来实现的逻辑呢&#xff1f;一个状态的轮转、事件订阅的通讯处理等。 状态机的实现方式千变万化&#xff0c;这里我会为你介绍一个简单的自循环状态机实现。 简单介绍 在开始之前&#xff0c;我先说明一下这个所谓…

C# Web控件与数据感应之 CheckBoxList 类

目录 关于数据感应 CheckBoxList 类 范例运行环境 数据源表设计 角色字典表 用户角色表 AutoValueDBList 方法 原理 设计 实现 调用示例 初始化数据 启动查询模式 使用保存模式 小结 关于数据感应 数据感应也即数据捆绑&#xff0c;是一种动态的&#xff0c;We…

PostgreSQL的扩展pgpool

PostgreSQL的扩展pgpool pgpool-II&#xff08;通常简称为 pgpool&#xff09;是一个流行的 PostgreSQL 中间件&#xff0c;广泛用于连接池、负载均衡、自动故障转移等场景。作为一种高级数据库解决方案&#xff0c;pgpool 能够在多个 PostgreSQL 服务器之间分配数据库查询&am…

base64解码时报错“decode base64: invalid input“

现象 用base64 -d 去还原base64编码后的文件时报错decode base64: invalid input 例如: $ base64 test.zip | base64 -d > test2.zip base64: invalid input $ ll test* -rw-r--r-- 1 user grp 152 19 11:41 test.zip -rw-r--r-- 1 user grp 57 19 11:42 test2.zip解决办…

【Docker学习】docker version查看版本信息

就像很多应用一样&#xff0c;docker也使用version来查看版本信息。但因为docker包含有不少独立组件&#xff0c;version的作用范围会更广一些。 用法1&#xff1a; docker --version 描述&#xff1a; 输出安装的Docker CLI 的版本号。关于Docker CLI&#xff0c;请访问。 实操…

项目管理-项目范围管理2/2

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 项目范围管理&#xff0c;过程 6个&#xff0c;包括“规收定 创确控”&#xff1a; 规划范围管理收集需求定义范围创建WBS确认范围控制…

【YOLOv8报错】ModuleNotFoundError: No module named ‘lap‘

文章目录 【问题描述】【解决方式】【参考链接】 【问题描述】 使用YOLOv8进行追踪运行代码时报错&#xff1a;ModuleNotFoundError: No module named lap 【解决方式】 执行以下命令 pip install lapx【参考链接】 https://github.com/ultralytics/ultralytics/issues/177…

怎么证明E[E(X|Y,Z)Y]= E(X|Y)

性质8的证明 物理意义

Python词频统计

在Python中进行词频统计是一项基础的文本分析任务&#xff0c;通常涉及以下步骤&#xff1a; 文本预处理&#xff1a;包括去除标点符号、转换为小写、去除停用词等。分词&#xff1a;将文本分割成单词或词汇。统计词频&#xff1a;对分词后的结果进行计数。 以下是一个简单的…

webpack基础---常用loader

webpack 命令式和配置文件 html-webpack-plugin 配置项&#xff1a;{ templete: filename: inject: } 清除上次打包的文件&#xff0c;output: { clear: true } mode选项&#xff1a; none development prodution souce-map&#xff1a;可以精准定位代码行数 { devt…

【Android学习】简易计算器的实现

1.项目基础目录 新增dimens.xml 用于控制全部按钮的尺寸。图片资源放在drawable中。 另外 themes.xml中原来的 <style name"Theme.Learn" parent"Theme.MaterialComponents.DayNight.DarkActionBar">变为了&#xff0c;加上后可针对button中增加图片…

发卡授权盗u系统源码ZHU

2024最新UI发卡盗U/支持多语言/更新UI界面/支持多个主流钱包去除后门板&#xff0c; 搭建系统TGaqxm01&#xff0c;最好是部署智能合约后用合约地址来授权包含转账支付页面盗U授权源码。 完美提U&#xff0c;教程包含如何提u 。功能完美。 1.Php静态 2.目录puicta 3.扩sal 4.s…

机车 - 什么是点火正时

摩托车发动机点火正时简介 当摩托车发动机在压缩行程将要结束时&#xff0c;发动机的火花塞会准时的点火&#xff0c;使混合气燃烧&#xff0c;产生强大膨胀压力&#xff0c;推动活塞下行作功产生动力。但是这个从燃烧到产生最大膨胀压力需要一定的时间。这就需要活塞在到达上死…

416. 分割等和子集

两维dp class Solution {public boolean canPartition(int[] nums) {int n nums.length;int sum 0;for(int i0;i<n;i){sumnums[i];}if(sum%2 ! 0)return false;int target sum/2;boolean[][] dp new boolean[n][target1];// 初始化&#xff0c;初始化dp表格的第一行元素…

Spring Boot中使用Redis和Lua脚本实现延时队列

码到三十五 &#xff1a; 个人主页 延时队列是一种常见的需求。延时队列允许我们延迟处理某些任务&#xff0c;这在处理需要等待一段时间后才能执行的操作时特别有用&#xff0c;如发送提醒、定时任务等。文中&#xff0c;将介绍如何在Spring Boot环境下使用Redis和Lua脚本来实…

C#三人飞行棋

C#三人飞行棋 #region 1控制台设置int w 50, h 30; ConsoleInit(w, h); #endregion#region 2 场景选择实例//声明一个表示场景标识的变量 E_SceneType nowSceneType new E_SceneType(); while (true) {switch (nowSceneType){case E_SceneType.Begion://开始场景逻辑Consol…

吴恩达机器学习笔记 三十七 电影推荐系统 使用特征 成本函数 协同过滤算法

以电影评分系统为例&#xff0c;令 r(i, j) 来表示用户 j 已经对电影 i 评分&#xff0c; y&#xff08;i, j&#xff09;表示评分具体是多少。 假如每部电影有自己的特征&#xff0c;那么用户 j 对电影 i 的评分预测为 w(j) * x(i) b(j) r(i, j) &#xff1a;一个用户 j 是否…

global IoT SIM解决方案

有任何关于GSMA\IOT\eSIM\RSP\业务应用场景相关的问题&#xff0c;欢迎W: xiangcunge59 一起讨论, 共同进步 (加的时候请注明: 来自CSDN-iot). Onomondo提供的全球IoT SIM卡解决方案具有以下特点和优势&#xff1a; 1. **单一全球配置文件**&#xff1a;Onomondo的SIM卡拥…

【C++风云录】破解聊天机器人开发:寻找最适合你的工具

重量级面面观&#xff1a;六大顶级聊天机器人开发工具的对比 前言 在本文中&#xff0c;我们将深入探讨六种不同的C集成聊天机器人开发工具&#xff0c;包括Botkit, DialogueFlow, Rasa, Wit.ai, IBM Watson Assistant和 Microsoft Bot Framework。每个工具都将从选择原因&am…