队列和栈的实现

文章目录

  • 队列
    • 队列的定义
    • 队列常见的基本操作
    • 队列的顺序存储结构
    • 实现
    • 栈的定义
    • 栈的常见基本操作
    • 栈的顺序存储
      • 实现
    • 栈的链式存储
      • 实现

队列

队列的定义

 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。
在这里插入图片描述
队头(Front):允许删除的一端,又称队首。
队尾(Rear):允许插入的一端。
空队列:不包含任何元素的空表。

队列常见的基本操作

nitQueue(&Q):初始化队列,构造一个空队列Q。
QueueEmpty(Q):判队列空,若队列Q为空返回true,否则返回false。
EnQueue(&Q, x):入队,若队列Q未满,将x加入,使之成为新的队尾。
DeQueue(&Q, &x):出队,若队列Q非空,删除队头元素,并用x返回。
GetHead(Q, &x):读队头元素,若队列Q非空,则将队头元素赋值给x。

队列的顺序存储结构

初始状态(队空条件):Q->front == Q->rear == 0。
进队操作:队不满时,先送值到队尾元素,再将队尾指针加1。
出队操作:队不空时,先取队头元素值,再将队头指针加1。
在这里插入图片描述

实现

SeqQueue.h

#pragma once
#ifndef SEQQUEUE_H
#define SEQQUEUE_H#define MAX_SIZE 1024#include <stdio.h>
#include <stdlib.h>typedef struct SEQQUEUE_H {void* data[MAX_SIZE];int size;
}SeqQueue;//初始化 //入列//返回队头元素//出队//返回队尾元素//返回大小//清空队列//销毁
SeqQueue* Init_SeqQueue();
//入列
void Push_SeqQueue(SeqQueue* queue, void* data);
//返回队头元素
void* Front_SeqQueue(SeqQueue* queue);
//出队
void Pop_SeqQueue(SeqQueue* queue);
//返回队尾元素
void* Back_SeqQueue(SeqQueue* queue);
//返回大小
int Size_SeqQueue(SeqQueue* queue);
//清空队列
void Clear_SeqQueue(SeqQueue* queue);
//销毁
void FreeSpace_SeqQueue(SeqQueue* queue);#endif // !SEQQUEUE_H

SeqQueue.c

#include "SeqQueue.h"//初始化 //入列//返回队头元素//出队//返回队尾元素//返回大小//清空队列//销毁
SeqQueue* Init_SeqQueue()
{SeqQueue* queue = (SeqQueue*)malloc(sizeof(SeqQueue));for (int i = 0; i < MAX_SIZE; i++){queue->data[i] = NULL;}queue->size = 0;return queue;
}//入列
void Push_SeqQueue(SeqQueue* queue, void* data)
{if (!queue || !data){return;}if (queue->size == MAX_SIZE){return;}queue->data[queue->size] = data;queue->size++;
}//返回队头元素
void* Front_SeqQueue(SeqQueue* queue)
{if (!queue){return NULL;}if (queue->size == 0){return NULL;}return queue->data[0];
}//出队
void Pop_SeqQueue(SeqQueue* queue)
{if (!queue){return;}if (queue->size == 0){return;}for (int i = 0; i < queue->size - 1; i++){queue->data[i] = queue->data[i + 1];}queue->size--;
}//返回队尾元素
void* Back_SeqQueue(SeqQueue* queue)
{if (!queue){return NULL;}if (queue->size == 0){return NULL;}return queue->data[queue->size - 1];
}//返回大小
int Size_SeqQueue(SeqQueue* queue)
{if (!queue){return -1;}return queue->size;
}//清空队列
void Clear_SeqQueue(SeqQueue* queue)
{if (!queue){return;}queue->size = 0;
}//销毁
void FreeSpace_SeqQueue(SeqQueue* queue)
{if (!queue){return;}free(queue);
}

main.c

#include "SeqQueue.h"typedef struct PERXON {char name[64];int age;
}Person;int main()
{//创建队列SeqQueue* queue = Init_SeqQueue();//创建数据Person p1 = { "aaa", 10 };Person p2 = { "bbb", 20 };Person p3 = { "ccc", 30 };Person p4 = { "ddd", 40 };Person p5 = { "eee", 50 };//数据入队列Push_SeqQueue(queue, &p1);Push_SeqQueue(queue, &p2);Push_SeqQueue(queue, &p3);Push_SeqQueue(queue, &p4);Push_SeqQueue(queue, &p5);//输出队尾元素Person* backPerson = (Person*)Back_SeqQueue(queue);printf("队尾元素:Name:%s, Age:%d\n", backPerson->name, backPerson->age);while (Size_SeqQueue(queue)){//取出队头元素Person* p = (Person*)Front_SeqQueue(queue);printf("Name:%s, Age:%d\n", p->name, p->age);//从队头弹出Pop_SeqQueue(queue);}FreeSpace_SeqQueue(queue);return 0; 
}

在这里插入图片描述

栈的定义

 栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。
在这里插入图片描述
栈顶(Top):线性表允许进行插入删除的那一端。
栈底(Bottom):固定的,不允许进行插入和删除的另一端。
空栈:不含任何元素的空表。
栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。

栈的常见基本操作

InitStack(&S):初始化一个空栈S。
StackEmpty(S):判断一个栈是否为空,若栈为空则返回true,否则返回false。
Push(&S, x):进栈(栈的插入操作),若栈S未满,则将x加入使之成为新栈顶。
Pop(&S, &x):出栈(栈的删除操作),若栈S非空,则弹出栈顶元素,并用x返回。
GetTop(S, &x):读栈顶元素,若栈S非空,则用x返回栈顶元素。
DestroyStack(&S):栈销毁,并释放S占用的存储空间(“&”表示引用调用)。

栈的顺序存储

 采用顺序存储的栈称为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶元素的位置。
若存储栈的长度为StackSize,则栈顶位置top必须小于StackSize。当栈存在一个元素时,top等于0,因此通常把空栈的判断条件定位top等于-1。

实现

SeqStack.h

#pragma once
#ifndef SEQSTACK_H
#define SEQSTACK_H#include <stdio.h>
#include <stdlib.h>//数组去模拟栈的顺序存储
#define MAX_SIZE 1024
#define SEQSTACK_TRUE 1
#define SEQSTACK_FALSE 0typedef struct SEQSTACK {void* data[MAX_SIZE];int size;
}SeqStack;//初始化栈 
SeqStack* Init_SeqStack();
//入栈
void Push_SeqStack(SeqStack* stack, void* data);
//返回栈顶元素
void* Top_SeqStack(SeqStack* stack);
//出栈
void Pop_SeqStack(SeqStack* stack);
//判断是否为空
int IsEmpty(SeqStack* stack);
//返回栈中元素的个数
int Size_SeqStack(SeqStack* stack);
//清空栈
void Clear_SeqStack(SeqStack* stack);
//销毁
void FreeSpace_SeqStack(SeqStack* stack);
#endif // !SEQSTACK_H

SeqStack.c

#include "SeqStack.h"//初始化栈 
SeqStack* Init_SeqStack()
{SeqStack* stack = (SeqStack*)malloc(sizeof(SeqStack));for (int i = 0; i < MAX_SIZE; i++){stack->data[i] = NULL;}stack->size = 0;return stack;
}//入栈
void Push_SeqStack(SeqStack* stack, void* data)
{if (!stack || !data){return;}if (stack->size == MAX_SIZE){return;}stack->data[stack->size] = data;stack->size++;
}
//返回栈顶元素
void* Top_SeqStack(SeqStack* stack)
{if (stack == NULL){return NULL;}if (stack->size == 0){return NULL;}return stack->data[stack->size - 1];
}
//出栈
void Pop_SeqStack(SeqStack* stack)
{if (stack == NULL){return;}if (stack->size == 0){return;}stack->data[stack->size - 1] = NULL;stack->size--;
}//判断是否为空
int IsEmpty(SeqStack* stack)
{if (stack == NULL){return -1;}if(stack->size == 0){return SEQSTACK_TRUE;}return SEQSTACK_FALSE;
}//返回栈中元素的个数
int Size_SeqStack(SeqStack* stack)
{return stack->size;
}//清空栈
void Clear_SeqStack(SeqStack* stack)
{if(stack == NULL){return;}for (int i = 0; i < stack->size; i++){stack->data[i] = NULL;}stack->size = 0;
}//销毁
void FreeSpace_SeqStack(SeqStack* stack)
{if (stack == NULL){return;}free(stack);
}

main.c

#include "SeqStack.h"typedef struct PERSON 
{char name[64];int age;
}Person;int main()
{//创建栈SeqStack* stack = Init_SeqStack();//创建数据Person p1 = { "aaa", 10 };Person p2 = { "bbb", 20 };Person p3 = { "ccc", 30 };Person p4 = { "ddd", 40 };Person p5 = { "eee", 50 };//入栈Push_SeqStack(stack, &p1);Push_SeqStack(stack, &p2);Push_SeqStack(stack, &p3);Push_SeqStack(stack, &p4);Push_SeqStack(stack, &p5);//输出while (!IsEmpty(stack)){Person * person = (Person *) Top_SeqStack(stack);printf("%s->%d\n", person->name, person->age);Pop_SeqStack(stack);}FreeSpace_SeqStack(stack);return 0;
}

在这里插入图片描述

栈的链式存储

 采用链式存储的栈称为链栈,链栈的优点是便于多个栈共享存储空间和提高其效率,且不存在栈满上溢的情况。通常采用单链表实现,并规定所有操作都是在单链表的表头进行的。这里规定链栈没有头节点,Lhead指向栈顶元素,如下图所示。
在这里插入图片描述

实现

LinkStack.h

#pragma once
#ifndef LINKSTACK_H
#define LINKSTACK_H#include <stdio.h>
#include <stdlib.h>//链式栈的结点
typedef struct LINKNODE {struct LINKNODE* next;
}LinkNode;
//链式栈
typedef struct LINKSTACK {LinkNode head;int size;
}LinkStack;//初始化函数
LinkStack* Init_LinkStack();
//入栈
void Push_LinkStack(LinkStack* stack, LinkNode* data);
//出栈
void Pop_LinkStack(LinkStack* stack);
//返回栈顶元素
LinkNode* Top_LinkStack(LinkStack* stack);
//返回栈元素的个数
int Size_LinkStack(LinkStack* stack);
//清空栈
void clear_LinkStack(LinkStack* stack);
//销毁栈
void FreeSpace_LinkStack(LinkStack* stack);#endif // !LINKSTACK_H

LinkStack.c

#include "LinkStack.h"//初始化函数
LinkStack* Init_LinkStack()
{LinkStack* stack = (LinkStack*)malloc(sizeof(LinkStack));stack->head.next = NULL;stack->size = 0;return stack;
}//入栈
void Push_LinkStack(LinkStack* stack, LinkNode* data)
{if (!stack || !data){return;}data->next = stack->head.next;stack->head.next = data;stack->size++;
}//出栈
void Pop_LinkStack(LinkStack* stack)
{if (!stack){return;}if (stack->size == 0){return;}LinkNode* pCurrent = stack->head.next;stack->head.next = pCurrent->next;stack->size--;
}
//返回栈顶元素
LinkNode* Top_LinkStack(LinkStack* stack)
{if (!stack){return NULL;}if (stack->size == 0){return NULL;}return stack->head.next;
}//返回栈元素的个数
int Size_LinkStack(LinkStack* stack)
{return stack->size;
}//清空栈
void clear_LinkStack(LinkStack* stack)
{if (!stack){return;}if (stack->size == 0){return;}stack->head.next = NULL;stack->size = 0;
}//销毁栈
void FreeSpace_LinkStack(LinkStack* stack)
{if (!stack){return;}free(stack);
}

main.c

#include "LinkStack.h"typedef struct PERSON
{LinkNode node;char name[64];int age;
}Person;int main()
{//创建栈LinkStack* stack = Init_LinkStack();//创建数据Person p1, p2, p3, p4, p5;strcpy(p1.name, "aaa");strcpy(p2.name, "bbb");strcpy(p3.name, "ccc");strcpy(p4.name, "ddd");strcpy(p5.name, "eee");p1.age = 10;p2.age = 20;p3.age = 30;p4.age = 40;p5.age = 50;//入栈Push_LinkStack(stack, (LinkNode*)&p1);Push_LinkStack(stack, (LinkNode*)&p2);Push_LinkStack(stack, (LinkNode*)&p3);Push_LinkStack(stack, (LinkNode*)&p4);Push_LinkStack(stack, (LinkNode*)&p5);while (Size_LinkStack(stack)){//取出栈顶元素Person* p = (Person*)Top_LinkStack(stack);printf("Name:%s Age:%d\n", p->name, p->age);//弹出栈顶元素Pop_LinkStack(stack);}FreeSpace_LinkStack(stack);return 0;
}

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

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

相关文章

Vitis HLS 学习笔记--聚合与解聚-AXI主接口

目录 1. 简介 2. 用法及语法 3. 详细解读 4. 总结 1. 简介 在使用 Vitis HLS 工具进行硬件设计时&#xff0c;如果你在接口上使用了结构体&#xff0c;工具会自动把结构体里的所有元素组合成一个整体。就像把一堆零件组装成一个玩具一样。这样做的好处是&#xff0c;数据可…

【西瓜书】大题

1.线性回归 思路&#xff1a;ywxb&#xff0c;w为一维数组&#xff0c;求均方误差MSE&#xff0c;对w和b分别求偏导为0得到关于w和b的闭式求解。预测第十年的代入ywxb求解即可。 2.查准率、查全率 思路&#xff1a;先计算每个算法测试结果的混淆矩阵&#xff0c;再根据混淆矩阵…

pyrouge(ROUGE-1.5.5)的安装步骤和使用说明(适用于Linux 系统)

摘要&#xff1a;本文讲解了如何配置和使用文本摘要的评价指标ROUGE(linux 系统)。 ✅ NLP 研 1 选手的学习笔记 简介&#xff1a;小王&#xff0c;NPU&#xff0c;2023级&#xff0c;计算机技术 研究方向&#xff1a;摘要生成、大语言模型生成 文章目录 一、为啥要写这篇博客&…

问题汇总:MPU6050(软件iic)

以下为个人问题汇总&#xff0c;排查点汇总可能大有缺陷&#xff0c;如有错误&#xff0c;欢迎指正。 排查点汇总 检查软件iic的时序操作用示波器或逻辑分析仪检查波形 无法使用逻辑分析仪进行I/O引脚波形分析 充当SDA、SCL的引脚要配置为推挽输出; 另外&#xff0c;逻辑分…

挑战绝对不可能:再证有长度不同的射线

黄小宁 一空间坐标系中有公共汽车A&#xff0c;A中各座位到司机处的距离h是随着座位的不同而不同的变数&#xff0c;例如5号座位到司机处的距离是h3&#xff0c;…h5&#xff0c;…。A移动了一段距离变为汽车B≌A&#xff0c;B中5号座位到司机处的距离h’h3&#xff0c;…h’h5…

LLVM Cpu0 新后端 系列课程总结

想好好熟悉一下llvm开发一个新后端都要干什么&#xff0c;于是参考了老师的系列文章&#xff1a; LLVM 后端实践笔记 代码在这里&#xff08;还没来得及准备&#xff0c;先用网盘暂存一下&#xff09;&#xff1a; 链接: https://pan.baidu.com/s/1yLAtXs9XwtyEzYSlDCSlqw?…

测试与开发

目录 按照测试目标分类 界面测试 功能测试 性能测试 可靠性测试 安全性测试 易用性测试 按照执行方式分类&#xff1a; 测试方法 白盒测试 语句覆盖 条件覆盖 判定条件覆盖 条件组合覆盖 路径覆盖 黑盒测试 灰盒测试 按照测试阶段分类 单元测试 集成测试 …

【iOS】界面推出的方法

【iOS】界面推出的方法 在学习过程中我们发现在iOS中有两种界面推出的方法&#xff1a;push 和 present这两种方法都可以用来推出一个新的界面 但是这两者是存在区别的 push 方法是通过 UINavigationController 进行导航,新的视图控制器会被压入导航栈中&#xff0c;可以跨级…

写给大数据开发,如何去掌握数据分析

这篇文章源于自己一个大数据开发&#xff0c;天天要做分析的事情&#xff0c;发现数据分析实在高大上很多&#xff0c;写代码和做汇报可真比不了。。。。 文章目录 1. 引言2. 数据分析的重要性2.1 技能对比2.2 业务理解的差距 3. 提升数据分析能力的方向4. 数据分析的系统过程4…

前端 JS 经典:Promise 详解

1. Promise 由来 在以前我们实现异步是用的回调函数&#xff0c;当一个异步请求需要依赖上一个异步请求返回的结果的时候&#xff0c;就会形成如下这种的调用结构。 请求1(function (结果1) {请求2(function (结果2) {请求3(function(结果3)) {请求4(function(结果4) {})}});…

Windows下载安装RabbitMQ客户端(2024最新篇)

文章目录 RabbitMQ认知RabbitMQ下载RabbitMQ安装 更多相关内容可查看 RabbitMQ认知 定义&#xff1a;RabbitMQ是一个消息中间件&#xff0c;它接受并转发消息。你可以把它当做一个快递站点&#xff0c;当你要发送一个包裹时&#xff0c;你把你的包裹放到快递站&#xff0c;快递…

免费!GPT-4o发布,实时语音视频丝滑交互

We’re announcing GPT-4o, our new flagship model that can reason across audio, vision, and text in real time. 5月14日凌晨&#xff0c;OpenAI召开了春季发布会&#xff0c;发布会上公布了新一代旗舰型生成式人工智能大模型【GPT-4o】&#xff0c;并表示该模型对所有免费…

JDBC简介以及快速入门

这些都是JDBC提供的API 简介 每一个数据库的底层细节都不一样 不可能用一套代码操作所有数据库 我们通过JDBC可以操作所有的数据库 JDBC是一套接口 我们自己定义了实现类 定义实现类 然后就能用Java操作自己的数据库了 MySQL对于JDBC的实现类 就是驱动 快速入门 创建新的项…

vscode copilot git commit 生成效果太差,用其他模型替换

问题 众所周知&#xff0c;copilot git commit 就像在随机生成 git commit 这种较为复杂的内容还是交给大模型做比较合适 方法 刚好&#xff0c;gitlens 最近开发了 AI commit的功能&#xff0c;其提供配置url api可以实现自定义模型 gitlens 只有3种模型可用&#xff1a…

【Python】在【数据挖掘】与【机器学习】中的应用:从基础到【AI大模型】

目录 &#x1f497;一、Python在数据挖掘中的应用&#x1f495; &#x1f496;1.1 数据预处理&#x1f49e; &#x1f496;1.2 特征工程&#x1f495; &#x1f497;二、Python在机器学习中的应用&#x1f495; &#x1f496;2.1 监督学习&#x1f49e; &#x1f496;2.2…

树二叉树

树 ​ 树是 n&#xff08;n≥0&#xff09;个结点的有限集。当 n 0时&#xff0c;称为空树。在任意一颗非空树中应满足&#xff1a; &#xff08;1&#xff09;有且仅有一个特定的称为根的结点。 &#xff08;2&#xff09;当 n > 1时&#xff0c;其余结点可分为 m&…

基于小波的多元信号降噪-基于马氏距离和EDF统计(MATLAB R2018a)

马氏距离是度量学习中一种常用的距离指标&#xff0c;通常被用作评定数据样本间的相似度&#xff0c;可以应对高维线性分布数据中各维度间非独立同分布的问题&#xff0c;计算方法如下。 &#xff08;1&#xff09;计算样本向量的平均值。 &#xff08;2&#xff09;计算样本向…

Golang的协程调度器GMP

目录 GMP 含义 设计策略 全局队列 P的本地队列 GMP模型以及场景过程 场景一 场景2 场景三 场景四 场景五 场景六 GMP 含义 协程调度器&#xff0c;它包含了运行协程的资源&#xff0c;如果线程想运行协程&#xff0c;必须先获取P&#xff0c;P中还包含了可运行的G…

零基础直接上手java跨平台桌面程序,使用javafx(二)可视化开发Scene Builder

我们只做实用的东西&#xff0c;不学习任何理论&#xff0c;如果你想学习理论&#xff0c;请去买几大本书&#xff0c;慢慢学去。 NetBeans有可视化工具&#xff0c;但是IntelliJ IDEA对于javafx,默认是没有可视化工具的。习惯用vs的朋友觉得&#xff0c;写界面还要是有一个布局…

永久免费的iPhone,iPad,Mac,iWatch锁屏,桌面壁纸样机生成器NO.105

使用这个壁纸样机生成器&#xff0c;生成iPhone&#xff0c;iPad&#xff0c;Mac&#xff0c;iWatch锁屏&#xff0c;桌面壁纸&#xff0c;展示你的壁纸作品&#xff0c;一眼就看出壁纸好不好看&#xff0c;适不适合 资源来源于网络&#xff0c;免费分享仅供学习和测试使用&am…