【栈和队列】

article/2025/10/16 0:35:26

大家好,这里是针对栈和队列做的一些总结归类,主要是介绍了栈和队列的相关操作,特意整理出来一篇博客供我们一起复习和学习,如果文章中有理解不当的地方,还希望朋友们在评论区指出,我们相互学习,共同进步!

文章目录

  • 一:栈
    • 1.1 栈的概念及结构
    • 1.2 栈的实现
    • 1.3 典型案例
  • 二:队列
    • 2.1 队列的概念及结构
    • 2.2 队列的实现

一:栈

1.1 栈的概念及结构

栈:是一种基于先进后出(FILO)的数据结构,是一种只能在一端进行插入和删除操作的特殊性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据。
压栈:栈的插入操作叫做进栈\压栈\入栈,入数据在栈顶。
出栈:栈的删除操作叫出栈,出数据也在栈顶。
在这里插入图片描述

1.2 栈的实现

头文件Stack.h:

typedef int STDataType;typedef struct Stack
{STDataType* a;int top;		// 栈顶的位置int capacity;	// 容量
}ST;void StackInit(ST* ps);//栈初始化
void StackDestory(ST* ps);//销毁栈
void StackPush(ST* ps, STDataType x);//压栈
STDataType StackTop(ST* ps);//出栈
void StackPop(ST* ps);
bool StackEmpty(ST* ps);//判断栈区是否为空
int StackSize(ST* ps);//计算栈的元素

1:栈初始化

void StackInit(ST* ps){assert(ps);ps->a = NULL;ps->top = 0;ps->capacity = 0;
}

2:销毁栈

void StackDestory(ST* ps){assert(ps);free(ps->a);ps->a = NULL;ps->capacity = ps->top = 0;
}

3:压栈

void StackPush(ST* ps, STDataType x){assert(ps);if (ps->capacity == ps->top){int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;ps->a =(STDataType *)realloc(ps->a, newCapacity * sizeof(STDataType));if (!(ps->a)){printf("realloc fail\n");exit(-1);}else{ps->capacity = newCapacity;}}ps->a[ps->top] = x;(ps->top)++;
}

4:出栈

STDataType StackTop(ST* ps){assert(ps);assert(ps->top > 0);return ps->a[ps->top - 1];
}void StackPop(ST* ps){assert(ps);assert(ps->top > 0);(ps->top)--;
}

5:判断栈是否为空

bool StackEmpty(ST* ps){assert(ps);if (ps->top == 0){return true;}else{return false;}
}

6:计算栈内个数

int StackSize(ST* ps){assert(ps);return ps->top;
}

1.3 典型案例

括号匹配问题:LeetCode链接

二:队列

2.1 队列的概念及结构

队列是一种基于先进先出(FIFO)的数据结构,是一种只能在一端进行插入,在另一端进行删除操作的特殊线性结构,它按照先进先出的原则存储数据,先进入的数据,在读取的时候先被读出来。
在这里插入图片描述
在这里插入图片描述

2.2 队列的实现

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

typedef int QDataType;typedef struct QueueNode
{QDataType data;struct QueueNode* next;
}QNode;typedef struct Queue
{QNode* head;QNode* tail;//size_t size;
}Queue;
//初始化队列
void QueueInit(Queue* pq);
//销毁队列
void QueueDestory(Queue* pq);
//入队列
void QueuePush(Queue* pq, QDataType x);
//出队列
void QueuePop(Queue* pq);
//是否空队列
bool QueueEmpty(Queue* pq);
//队列大小
size_t QueueSize(Queue* pq);
//队头元素
QDataType QueueFront(Queue* pq);
//队尾元素
QDataType QueueBack(Queue* pq);

1:初始化队列

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

2:销毁队列

void QueueDestory(Queue* pq){assert(pq);QNode * cur = pq->head;while (cur){QNode * Next = cur->next;free(cur);cur = NULL;cur = Next;}pq->head = pq->tail = NULL;
}

3:入队列

void QueuePush(Queue* pq, QDataType x){assert(pq);QNode * newnode = (QNode *)malloc(sizeof(QNode));if (!newnode){printf("malloc fail\n");exit(-1);}else{if (pq->tail == NULL){assert(pq->head == NULL);pq->head = pq->tail = newnode;newnode->data = x;newnode->next = NULL;}else{pq->tail->next = newnode;newnode->data = x;newnode->next = NULL;pq->tail = newnode;}}
}

4:出队列

void QueuePop(Queue* pq){assert(pq);assert(pq->head && pq->tail);if (pq->head->next == NULL){free(pq->head);pq->head = pq->tail = NULL;}else{QNode* Next = pq->head->next;free(pq->head);pq->head = Next;}
}

5:是否空队列

bool QueueEmpty(Queue* pq){assert(pq);return pq->head == NULL && pq->tail == NULL;
}

6:队列大小

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

7:队头元素

QDataType QueueFront(Queue* pq){assert(pq);assert(pq->head);return pq->head->data;
}

8:队尾元素

QDataType QueueBack(Queue* pq){assert(pq);assert(pq->tail);return pq->tail->data;
}

深深的感谢您能够看到这里,祝您生活愉快,事业学习进步!!!


http://chatgpt.dhexx.cn/article/e2vxMhsx.shtml

相关文章

栈、队列

顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈项元素在顺序栈中的位置。通常的习惯做法是以top=0表示空栈,鉴于C语言中数组的下标约定从0开始,则当以C…

栈、队列、数组

栈 定义 #include <stdio.h>/* 栈只允许在栈顶插入删除操作的线性表Last Insert First Out. */// 顺序栈#define MaxSize 10typedef struct {int data[MaxSize]; // 静态数组存放栈元素int top; // 栈顶指针 } SqStack; 栈顶指针指向栈顶元素的栈 空为-1 // 栈顶指针指…

使用SQL进行两个表关联查询(inner)

结果显示 公司类型表 公司表 实现方式 SELECTt_company.id,cName, typeName, cDescribe, t_company.modifyTime, t_company.createTime FROMt_company INNER JOIN t_company_type ON t_company.cType t_company_type.id代码解析 SELECT 显示字段,如果两个表都有字段,则需要…

sql进行两个关联表,根据其中一个表的一个属性进行条件查询查询

我最近遇到了表的查询,但是通过查询发现,网上的sql的大神,写的文章到底是什么玩意? 我打算自己写一个sql专栏,特意讲解sql的使用,来帮助大家 这篇文章技术指导为sql进行两个关联表,根据其中一个表的一个属性进行条件查询查询 假设只有两张表,其中一张表最后一个外键连…

SQL关联查询详解,SQL JOIN详解

关联查询&#xff0c;也称为多表查询&#xff0c;指两个或更多个表一起完成查询操作。 前提条件&#xff1a;这些一起查询的表之间是有关系的&#xff08;一对一、一对多&#xff09;&#xff0c;它们之间一定是有关联字段&#xff0c;这个关联字段可能建立了外键&#xff0c;也…

SQL-多表关联查询详解

为了在工作中能更顺利的使用多表关联查询&#xff0c;今天这篇博客就写这个内容了。 在讲解多表关联查询之前&#xff0c;先生成测试表。 登录scott用户&#xff0c;运行以下语句生成测试表。 create table ex1 as select * from emp; create table ex2 as select * from dept…

Mysql如何对两张表的相同字段,同时查询两张数据表

前言 假设现在有两张数据表 表1如下&#xff1a; 表2如下&#xff1a; 表1和表2同时都再mysql的情况下&#xff0c;只有他们的uuid是一样的&#xff0c;其他字段信息不同&#xff0c;现在需要用sql语句根据uuid&#xff0c;同时将符合要求的数据查询出来&#xff0c;怎么做呢&…

SQL- join多表关联

一、SQL 连接(JOIN) 1、笛卡尔积 &#xff08;1&#xff09;当多张表进行连接查询&#xff0c;没有任何条件限制的时候&#xff0c;最终查询结果条数&#xff0c;是多张表条数的乘积 如A表15条&#xff08;行&#xff09;数据&#xff0c;B表20条&#xff08;行&#xff09;…

SQL语言多表关联查询

新建两张表&#xff1a; 表1&#xff1a;student 截图如下&#xff1a; 表2&#xff1a;course 截图如下&#xff1a; &#xff08;此时这样建表只是为了演示连接SQL语句&#xff0c;当然实际开发中我们不会这样建表&#xff0c;实际开发中这两个表会有自己不同的主键。&…

[转载]静息态fMRI、DTI、VBM

[转载]静息态fMRI、DTI、VBM (2014-06-19 19:00:15) 转载▼ 标签&#xff1a; 转载 分类&#xff1a; fMRI-EEG 原文地址&#xff1a;静息态fMRI、DTI、VBM作者&#xff1a;426l 一、 简介 1、静息态fMRI数据处理学习内容 BOLD-fMRI技术自1990年发明至今&#xff0c;已经成…

用FSL进行VBM统计分析

用FSL进行VBM统计分析 总体步骤概览1.准备数据1.1 T1数据格式1.2 Template_list查看数据 2.剥头皮&#xff1a;fslvbm_1_bet3.数据分割生成模板&#xff1a;fslvbm_2_template4.后处理&#xff08;标准化、调制、平滑&#xff09;&#xff1a;fslvbm_3_proc5.统计检验5.2查看结…

[spm操作] VBM分析中,modulation的作用

本帖作为 《用Matlab和SPM批量处理被试的经验总结》 的一部分 目录贴请见 http://home.52brain.com/forum.ph ... 1&extra#pid158525 在VBM分析中&#xff0c;通常都有一个modulation的选项&#xff0c;有些滴友对这个步骤的作用有点不太理解。 我先举一个例子&#xff…

不同的工具包对Voxel-based morphometry (VBM)计算结果的影响

​《本文同步发布于“脑之说”微信公众号&#xff0c;欢迎搜索关注~~》 前期大量的MRI研究已经表明&#xff0c;精神分裂患者很多脑区的局部灰质体积&#xff08;regional grey matter volume&#xff09;出现异常变化&#xff0c;但是这些研究的结果似乎并不一致。而这种结果…

如何提取差异脑区的灰质体积与临床量表算相关?——基于体素的形态学方法(VBM)

基于体素的形态学方法(VBM)是分析大脑解剖学(结构)差异最常用方法之一, 其通过给大脑volume逐体素打标签(分类)的方式来进行组织分割,过程高度自动化,比传统的基于ROI先验假设的分析方式得到的结果,更加具有稳定性和可重复性。VBM可以定量地测量出脑组织中各组织成分的…

VBM后的双样本t检验

上一篇文章写到做完了VBM&#xff0c;做完后因为数据一般都是患者组和HC组&#xff0c;这两个组之间需要进行比较&#xff0c;那么我们就要进行双样本t检验。 这里介绍双样本t检验的做法。 依然使用的是SPM-fMRI。 1.第一步是选择Specify 2nd-level 打开以后我们可以看到这个界…

VBM后的配对t检验以及xjview使用

之前写了VBM后的双样本t检验&#xff0c;再记录一下配对t检验。 配对t检验和双样本t检验的过程基本一致。包括以下三个步骤。 第一步输入两组被试时&#xff0c;应该成对输入&#xff0c;共有几个被试就有几个pair。 但是这里我在做的过程中没有加协变量&#xff0c;不知道会不…

Visual Basic

目录 一&#xff0c;Visual Basic 二&#xff0c;控制台程序 三&#xff0c;可视化程序 1&#xff0c;IDE 2&#xff0c;实例——加法计算器 一&#xff0c;Visual Basic Visual Basic是可视化的Basic&#xff0c;简称VB VB是第一个可视化编程语言。 二&#xff0c;控制…

VBM法MRI图像处理——记第一次使用cat12

1.环境 MATLAB 2015b SPM12 CAT12 2.SPM部分 命令行输入 spm 出现 以及 点击Toolbox 出现 3.CAT部分 点击上图 设置请根据自己需求 多分割了一种surface皮层数据&#xff0c;当做皮层统计分析SBM时需要提取surface皮层指标时会用到。 我本意只是获得灰质、白质的体积…

VBM_DARTEL算法对灰质变化的计算

根据一些文献得知&#xff0c;VBM目前比较新的算法是DARTEL算法&#xff0c;这一算法被集成在SPM里&#xff0c;这里记录一下做法。 VBM是对T1像进行分割得到灰质等。所以要有结构T1加权像数据。 整个流程应该是这样&#xff1a; 1.手动调整前联合&#xff08;AC&#xff09; …