3.栈和队列(汇总版)

目录

1.栈(一端插和删)

2.队列(一端插另一段删)

2.1队列的概念及结构

2.2 队列的实现

队列的接口

1.初始化队列

2.销毁队列

3.插入元素

4.出队列(头删)

5.访问对头

6.访问队尾

7.判断队列是否为空

8.查看队列的元素个数

Queue整体代码:

Queue.h

Queue.c

test.c 


1.栈(一端插和删)

1.1栈的概念及结构

:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。//后进去的数据会先出来

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

出栈:栈的删除操作叫做出栈。出数据也在栈顶。

【注意:】因为不知道什么时候出栈,所以顺序也是多变的

具体实现,可以看一下下面这个图片的演示 

关键的元素有

接下来就是我们的增删查改,通过接口来实现啦

主体:

// 静态
//typedef int STDataType;
// #define N 10
// typedef struct Stack
// {
//  STDataType _a[N];
//  int _top; // 栈顶
// }Stack;
//更多用的是下面的动态
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>typedef int STDataType;
typedef struct stack
{STDataType* a;//栈底int top;  //栈顶int capacity; //容量
}ST;//初始化栈
void STInit(ST* ps);
//销毁栈
void STDestory(ST* ps);
//入栈(压栈)
void STPush(ST* ps, STDataType x);
//出栈
void STPop(ST* ps);
//获取栈顶元素
STDataType STTop(ST* ps);
//获取栈中有效元素个数
int STSize(ST* ps);
//检测栈是否为空,如果为空返回非零结果,如果不为空返回0
bool STEmpty(ST* ps);

点拨: 

//入栈
ps->a[ps->top] = x;
ps->top++;
//出栈
ps->top--;
//获取栈顶元素
STDataType STTop(ST* ps)
{assert(ps);assert(!STEmpty(ps));return ps->a[ps->top - 1];//栈顶元素其实就是top前一位//这里注意栈为空时不能获取到元素
}

有一个小细节:栈顶初始化的选择会影响到栈,所以还是要通过接口来实现,如下

栈的灵魂就在于top,top++,top--,更多的还是在做题中去理解吧

2.队列(一端插另一段删)

2.1队列的概念及结构

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out)

入队列:进行插入操作的一端称为队尾

出队列:进行删除操作的一端称为队头

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数 组头上出数据,效率会比较低。

2.2 队列的实现

创建结构体QueueNode这个结构体是创建节点的,节点由数据和指向下一个节点的指针构成的

第二个结构体是创建指向节点的两个指针,对头指针head和队尾指针tail

typedef int QueueDataType;typedef struct QueueNode
{struct QueueNode* next;QueueDataType data;}QNode;typedef struct Queue
{QNode* head;QNode* tail;}Queue;

队列的接口

void QueueInit(Queue* pq);   //初始化队列
void QueueDestory(Queue* pq);    //销毁队列void QueuePush(Queue* pq, QueueDataType x); //插入元素
void QueuePop(Queue* pq);   //出队列QueueDataType QueueFront(Queue* pq);  //查看队头元素
QueueDataType QueueBack(Queue* pq);   //查看队尾元素bool QueueEmpty(Queue* pq);  //检查队列是否为空
int QueueSize(Queue* pq);    //查看队列的长度

1.初始化队列

void QueueInit(Queue* pq)
{assert(pq);pq->head = pq->tail = NULL;}

2.销毁队列

当队列不为空时,用一个代替对头往后访问的指针cur ,当cur不为空时,用一个新的节点del 接收cur指向的节点。将del节点释放并置为空,cur在往后走完成对队列的遍历,最后将对头指针和队尾指针都置为空指针

void QueueDestory(Queue* pq)
{assert(pq);QNode* cur = pq->head;//再在其中定义Qnode引入while (cur){QNode* del = cur;//暂存销毁cur = cur->next;//保留好进行后移free(del);del = NULL;//del对每个节点进行释放,保留了cur后移}pq->head = pq->tail = NULL;}

3.插入元素

队列的性质插入元素只能是尾插,分为两种情况来看:1.队列为空 2.队列不为空

1. 队列为空时,先去malloc一个新节点,让对头和队尾都指向这个新节点

2. 当队列不为空时,malloc一个新节点,将新节点插入到tail指针的下一个位置,新的队尾指向新节点的下一个位置

void QueuePush(Queue* pq, QueueDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode)); // 1.开辟一个新空间if (newnode == NULL)   {perror("malloc fail!!!");exit(-1);    //不成功直接退出程序}else{newnode->data = x;   //2. 将数据导入到新空间中newnode->next = NULL; //新节点指向空}//如果队列为空if (pq->head ==NULL&& pq->tail==NULL)//说明队列空{pq->head = pq->tail = newnode;  //都指向新节点}else{pq->tail->next = newnode;//3. 将tail的下一个定为newpq->tail = pq->tail->next;// tail后移}}

4.出队列(头删)

出队列也分为两种情况:1.队列有一个节点   2.队列有多个节点

void QueuePop(Queue* pq)//队列特性  头删
{assert(pq);assert(!QueueEmpty(pq));//一个节点if (pq->head->next == NULL){free(pq->head);pq->head = pq->tail = NULL;}else//很多节点{QNode* del = pq->head;//del暂存然后销毁pq->head = pq->head->next;//保留起来好进行后移free(del);del = NULL;}}

5.访问对头

访问得有元素,需要判断队列是否为空

QueueDataType QueueFront(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->head->data;
}

6.访问队尾

访问得保证队列有元素,需要判断队列是否为空

QueueDataType QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty);return pq->tail->data;
}

7.判断队列是否为空

bool QueueEmpty(Queue* pq)
{return pq->head == NULL;   //空返回1  有元素0}

8.查看队列的元素个数

查看队列元素的个数得保证队列有元素,生成一个新的指针接受队头指针,代替头指针往后访问队列,返回n 的数值就是队列的元素个数。

int QueueSize(Queue* pq)
{assert(pq);assert(!QueueEmpty);int n = 0;QNode* cur = pq->head;while (cur){++n;cur = cur->next;}return n;
}

Queue整体代码:

Queue.h

#include<stdio.h>
#include<stdbool.h>
#include<assert.h>
#include<stdlib.h>typedef int QueueDataType;typedef struct QueueNode
{struct QueueNode* next;QueueDataType data;}QNode;typedef struct Queue
{QNode* head;QNode* tail;}Queue;void QueueInit(Queue* pq);
void QueueDestory(Queue* pq);void QueuePush(Queue* pq, QueueDataType x);
void QueuePop(Queue* pq);QueueDataType QueueFront(Queue* pq);
QueueDataType QueueBack(Queue* pq);bool QueueEmpty(Queue* pq);
int QueueSize(Queue* pq);

Queue.c

#include "Queue.h"void QueueInit(Queue* pq)
{assert(pq);pq->head = pq->tail = NULL;}
void QueueDestory(Queue* pq)
{assert(pq);QNode* cur = pq->head;while (cur){QNode* del = cur;cur = cur->next;free(del);del = NULL;}pq->head = pq->tail = NULL;}void QueuePush(Queue* pq, QueueDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail!!!");exit(-1);}else{newnode->data = x;newnode->next = NULL;}//如果队列为空if (pq->head ==NULL&& pq->tail==NULL)//说明队列空{pq->head = pq->tail = newnode;}else{pq->tail->next = newnode;pq->tail = pq->tail->next;}}void QueuePop(Queue* pq)//队列特性  头删
{assert(pq);assert(!QueueEmpty(pq));//一个节点if (pq->head->next == NULL){free(pq->head);pq->head = pq->tail = NULL;}else//很多节点{QNode* del = pq->head;pq->head = pq->head->next;free(del);del = NULL;}}QueueDataType QueueFront(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->head->data;
}QueueDataType QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty);return pq->tail->data;
}bool QueueEmpty(Queue* pq)
{return pq->head == NULL;   //空返回1  有元素0}
int QueueSize(Queue* pq)
{assert(pq);assert(!QueueEmpty);int n = 0;QNode* cur = pq->head;while (cur){++n;cur = cur->next;}return n;}

test.c 

#include"Queue.h"void testqueue()
{Queue q;QueueInit(&q);QueuePush(&q, 555);QueuePush(&q, 666);QueuePush(&q, 777);QueuePush(&q, 1);while (!QueueEmpty(&q)){printf("%d", QueueFront(&q));QueuePop(&q);printf("\n");}QueueDestory(&q);
}int main()
{testqueue();return 0;
}

//书摘:问题的出现不是让你止步不前,而是为你指明方向

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

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

相关文章

CMakeLists.txt语法规则:foreach循环的关键字

一. 简介 前一篇文章学习了 CMakeLists.txt语法中 foreach循环的基本用法。文章如下&#xff1a; CMakeLists.txt语法规则&#xff1a;foreach 循环基本用法-CSDN博客 本文继续 CMakeLists.txt语法中 foreach循环语句&#xff0c;主要学习 foreach循环中的关键字。 二. CM…

Android 官网Ota介绍

构建 OTA 软件包 | Android 开源项目 | Android Open Source Project

(网络初识)

网络发展史 独立模式 在最开始计算机被发明出来&#xff0c;但网络还未普及的情况下&#xff0c;每个计算机之间都是相互独立的&#xff1a; 假设现在有一份数据需要处理&#xff0c;然后这份数据的处理又分给三个人分别处理。假设小松处理进行第一部分的处理&#xff0c;当小…

Skywalking的重要功能详解

学习本篇文章之前首先要了解一下Sky walking的基础知识 分布式链路追踪工具Sky walking详解 一&#xff0c;Sky walking监控数据库 在admin服务中&#xff0c;连接数据库查询user表中所有数据 引入依赖 <dependency><groupId>mysql</groupId><artifactI…

上位机图像处理和嵌入式模块部署(树莓派4b和qt应用全屏占有)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 我们都知道&#xff0c;嵌入式应用一般都是为了某一个特定应用而存在的。也就是说&#xff0c;和pc不同&#xff0c;这个嵌入式板子一般都是为了解…

多组间比较散点图+误差棒(自备)

目录 数据 计算四分位值 作图 数据 rm(list ls()) library(ggplot2) library(dplyr) library(ggpubr) library(reshape2) library(tidyverse)data <- iris##鸢尾花数据集 dat <- data[,c(5,1)]#单个数据进行分析 计算四分位值 #根据分组计算四分位及中位数 dat1 …

使用Docker安装Redis

大家好&#xff0c;今天给大家分享一下如何使用docker安装Redis&#xff0c;关于docker的安装和常用命令&#xff0c;大家可以参考下面两篇文章&#xff0c;本文中不做过多描述。 Docker在Windows与CentOS上的安装 Docker常用命令 关于Redis的介绍与常用操作可以参考&#x…

中国科技大航海时代,“掘金”一带一路

文&#xff5c;白 鸽 编&#xff5c;王一粟 “这不就是90年代的内地吗&#xff1f;” 在深度考察完沙特市场后&#xff0c;华盛集团联合创始人兼CEO张霆对镜相工作室感慨道。 在张霆看来&#xff0c;沙特落后的基建&#xff08;意味着大量创新空间&#xff09;、刚刚开放…

AHB---数据总线

1. 数据总线 为了实现AHB系统&#xff0c;需要独立的读写数据总线。虽然推荐的最小数据总线宽度被指定为32位&#xff0c;但这可以根据数据总线宽度进行更改。 数据总线包含以下部分&#xff1a; HWDATAHRDATAEndianness&#xff08;字节序&#xff09; 1.1 HWDATA 在写传输…

【革命启示录】Spring框架:Java开发的“核聚变”能量源!

Hello&#xff0c;我是阿佑&#xff0c;今天给大家整的活是 《Java开发的“核聚变”能量源》 文章目录 Spring框架原理详解一、引言简介目的特点例子 二、背景介绍问题解决方案例子 三、核心概念3.1 控制反转&#xff08;Inversion of Control, IoC&#xff09;定义实现例子与代…

Sarcasm detection论文解析 |基于情感背景和个人表达习惯的有效讽刺检测方法

论文地址 论文地址&#xff1a;https://link.springer.com/article/10.1007/s12559-021-09832-x#/ 论文首页 笔记框架 基于情感背景和个人表达习惯的有效讽刺检测方法 &#x1f4c5;出版年份:2022 &#x1f4d6;出版期刊:Cognitive Computation &#x1f4c8;影响因子:5.4 &…

【python】基础语法

目录 一.注释和常见规则 二.变量及类型 1.数据类型 2.Numbers数字数据类型 3. 字符串类型 &#xff08;1&#xff09;字符串访问 &#xff08;2&#xff09;字符串拼接 4.List&#xff08;列表&#xff09;类型 &#xff08;1&#xff09; 定义 &#xff08;2&#…

【Linux】yum

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; Linux &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 觉得本片文章写的还不错的可以&#x1f44d;点赞&#x1f44d;、&#x1f31f;收藏&#x1f31f;、&#x1f4dd;…

Golang | Leetcode Golang题解之第71题简化路径

题目&#xff1a; 题解&#xff1a; func simplifyPath(path string) string {stack : []string{}for _, name : range strings.Split(path, "/") {if name ".." {if len(stack) > 0 {stack stack[:len(stack)-1]}} else if name ! "" &am…

在uniapp里面使用 mp-html 并且开启 latex 功能

在uniapp里面使用 mp-html 并且开启 latex 功能 默认情况下 mp-html 是不会开启 latex 功能的, 如果需要开启 latex 功能是需要到代码操作拉取代码自行打包的。 这里说一下 mp-html 里面的 latex 功能是由 https://github.com/rojer95/katex-mini 提供的技术实现&#xff0c;…

计算机系列之数据库技术

13、数据库技术&#xff08;重点、考点&#xff09; 1、三级模式-两级映像&#xff08;考点&#xff09; 内模式&#xff1a;管理如何存储物理的数据&#xff0c;对应具体物理存储文件。 **模式&#xff1a;**又称为概念模式&#xff0c;就是我们通常使用的基本表&#xff0c…

每日算法-java

题目来自蓝桥云 // 这是一个Java程序&#xff0c;用于解决最长不下降子序列问题。 // 问题描述&#xff1a;给定一个整数序列&#xff0c;找到最长的子序列&#xff0c;使得这个子序列是不下降的&#xff08;即相邻的元素不严格递减&#xff09;。 // 程序使用了动态规划的方法…

【C语言】整数,浮点数数据在内存中的存储

Tiny Spark get dazzling some day. 目录 1. 整数在内存中的存储1.1 原码、反码、补码1.1 大小端存储1.2.1 字节序分类1.2.2 判断字节序 2. 浮点数在内存中的存储2.1 浮点数的存储形式2.2 浮点数的 “ 存 ”2.2.1 S2.2.2 E2.2.3 F 2.3 浮点数的 “ 取 ”2.3.1 S2.3.2 E、F 3. 浮…

读取打包到JAR中的文件:常见问题与解决方案(文件在但是报错not find)

读取打包到JAR中的文件&#xff1a;常见问题与解决方案 喝淡酒的时候&#xff0c;宜读李清照&#xff1b;喝甜酒时&#xff0c;宜读柳永&#xff1b;喝烈酒则大歌东坡词。其他如辛弃疾&#xff0c;应饮高梁小口&#xff1b;读放翁&#xff0c;应大口喝大曲&#xff1b;读李后主…

学习c#第26天 面向对象基础之类与对象

1.类 1.什么是类? 俗话说&#xff0c;“物以类聚&#xff0c;人以群分”。意思是同类的东西经常聚在一起&#xff0c;志同道合 的人相聚成群。前者说物&#xff0c;后者说人。这里以物来进行举例说明[见图]&#xff1a; 水果超市&#xff0c;所有同类的水果摆放在一起&#xf…