【数据结构】栈和队列

news2025/8/6 4:07:20

文章目录

    • 栈和队列
        • 栈的概念及结构
        • 栈的实现
          • 初始化栈
          • 入栈
          • 出栈
          • 获取栈顶元素
          • 获取栈中有效元素个数
          • 判断栈是否为空
          • 销毁栈
        • 括号匹配问题
      • 队列
        • 队列的概念及结构
        • 队列的实现
          • 初始化队列
          • 队尾入队列
          • 对头出队列
          • 获取队头元素
          • 获取队尾元素
          • 销毁队列
          • 判断队列是否为空

栈和队列

栈的概念及结构

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除操作。**进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。**栈中的数据元素遵守后进先出的原则。

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

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

image-20221115205528929

出栈就是少一个栈顶元素。

栈的实现

image-20221118144723000

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。

image-20221115210248613

image-20221115210305070

初始化栈
void StackInit(Stack* ps) {
	assert(ps);
	ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);
	if (ps->a == NULL) {
		perror("malloc fail");
		exit(-1);
	}
	ps->top = 0;
	ps->capacity = 4;
}
入栈
void StackPush(Stack* ps, STDataType x) {
	assert(ps);
    //判断栈是否满了,如果满了就扩容
	if (ps->top == ps->capacity) {
		STDataType* tmp = (STDataType*)realloc(ps->a, ps->capacity * 2 * sizeof(STDataType));
		if (tmp == NULL) {
			perror("realloc fail");
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity *= 2;
	}
	ps->a[ps->top] = x;
	ps->top++;
}
出栈
void StackPop(Stack* ps) {
	assert(ps);
	assert(!StackEmpty(ps));
	ps->top--;
}
获取栈顶元素
STDataType StackTop(Stack* ps) {
	assert(ps);
	assert(!StackEmpty(ps));
	return ps->a[ps->top - 1];
}
获取栈中有效元素个数
int StackSize(Stack* ps) {
	assert(ps);

	return ps->top;
}
判断栈是否为空
bool StackEmpty(Stack* ps) {
	assert(ps);
	return ps->top == 0;
}
销毁栈
void StackDestroy(Stack* ps) {
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->top = ps->capacity = 0;
}

括号匹配问题

思路:这题主要思路,就是遇见左括号就入栈,遇见右括号就将栈顶元素,拿出来对比是否匹配,如果不匹配就直接返回false.

image-20221118113513457

typedef char STDatatype;
typedef struct Stack
{
	STDatatype* a;
	int capacity;
	int top;   // 初始为0,表示栈顶位置下一个位置下标
}ST;


bool StackEmpty(ST* ps)
{
	assert(ps);
	return ps->top == -1;
}
void StackInit(ST* ps)
{
	assert(ps);

	//ps->a = NULL;
	//ps->top = 0;
	//ps->capacity = 0;

	ps->a = (STDatatype*)malloc(sizeof(STDatatype)* 4);
	if (ps->a == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}

	ps->top = -1;
	ps->capacity = 4;
}

void StackDestroy(ST* ps)
{
	assert(ps);

	free(ps->a);
	ps->a = NULL;
	ps->top = -1;
	ps->capacity = 0;
}

void StackPush(ST* ps, STDatatype x)
{
	assert(ps);

	// 
	if (ps->top+1 == ps->capacity)
	{
		STDatatype* tmp = (STDatatype*)realloc(ps->a, ps->capacity * 2 * sizeof(STDatatype));
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(-1);
		}

		ps->a = tmp;
		ps->capacity *= 2;
	}

	ps->top++;
	ps->a[ps->top] = x;
}

// 20:20
void StackPop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));

	ps->top--;
}

STDatatype StackTop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));

	return ps->a[ps->top];
}



int StackSize(ST* ps)
{
	assert(ps);

	return ps->top+1;
}

bool isValid(char * s){
    ST st;
    StackInit(&st);
    while(*s) {
        if(*s == '[' || *s == '(' || *s == '{') {
            StackPush(&st, *s);
            s ++;
        }else {
            if(StackEmpty(&st)) {
                StackDestroy(&st);
                return false;
            }
            char top = StackTop(&st);
            StackPop(&st);
            if(*s == ']' && top != '[' || *s == '}' && top != '{' || *s == ')' && top != '(') {
                StackDestroy(&st);
                return false;
            }else {
                s ++;
            }
        }
    }
    bool ret = StackEmpty(&st);
    StackDestroy(&st);
    return ret;
}

由于C语言没有栈这个类,所以我们需要自己实现栈,并调用来实现。

队列

队列的概念及结构

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

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

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

image-20221118115525187

队列的实现

image-20221118144645617

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

image-20221118144112948

初始化队列
void QueueInit(Queue* q) {
	assert(q);
	q->front = NULL;
	q->rear = NULL;
	q->size = 0;
}
队尾入队列
void QueuePush(Queue* q, QDataType data) {
	assert(q);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL) {
		perror("malloc fail");
		exit(-1);
	}
	newnode->data = data;
	newnode->pNext = NULL;
	if (q->rear == NULL) {
		q->front = q->rear = newnode;
	}
	else {
		q->rear->pNext = newnode;
		q->rear = newnode;
	}
	q->size++;
}
对头出队列
void QueuePop(Queue* q) {
	assert(q);
	assert(!QueueEmpty(q));
	if (q->front->pNext == NULL) {
		free(q->front);
		q->front = q->rear = NULL;
	}
	else {
		QNode* del = q->front;
		q->front = q->front->pNext;
		free(del);
	}
	q->size--;
}
获取队头元素
QDataType QueueFront(Queue* q) {
	assert(q);
	assert(!QueueEmpty(q));
	return q->front->data;
}
获取队尾元素
QDataType QueueBack(Queue* q) {
	assert(q);
	assert(!QueueEmpty(q));
	return q->rear->data;
}
销毁队列
void QueueDestroy(Queue* q) {
	assert(q);
	QNode* cur = q->front;
	while (cur) {
		QNode* del = cur;
		cur = cur->pNext;
		free(del);
	}
	q->front = q->rear = NULL;
	q->size = 0;
}
判断队列是否为空
bool QueueEmpty(Queue* q)
{
	assert(q);

	return q->front == NULL && q->rear == NULL;
}

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

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

相关文章

带你初识微服务

博客主页:踏风彡的博客 博主介绍:一枚在学习的大学生,希望在这里和各位一起学习。 所属专栏:SpringCloud 文章创作不易,期待各位朋友的互动,有什么学习问题都可在评论区留言或者私信我,我会尽我…

同花顺_代码解析_技术指标_L

本文通过对同花顺中现成代码进行解析,用以了解同花顺相关策略设计的思想 目录 LH_LYDG LH_猎鹰歼狐 LHBLX LHSJ LHTZ LHXJ LH猎狐雷达 LOF净值 LWR LH_LYDG 猎鹰渡关(检测大盘顶部) 指标用法: (1&#xff…

进程间的信号

目录 一.信号入门 1.1概念 1.2信号发送与记录 1.3信号的处理方式 二.产生信号的方式 2.1通过终端按键产生 2.2通过系统函数向进程发信号 2.3由软件条件产生信号 2.4由硬件异常产生信号 三.阻塞信号 3.1信号相关概念 3.2信号在内核的表示 3.3sigset_t: 3.4…

工具及方法 - 使用Total Commander来查找重名文件

我只是一个Total Commander的轻度使用者,主要使用的是打开多个窗口,可以方便的以标签形式切换。 还有,这个软件是免费的,只是免费版打开时多一步,要输入个数字验证。 今天在使用一个SDK时,要包含进很多头文…

论文阅读笔记《Locality Preserving Matching》

核心思想 该文提出一种基于局部保持的特征匹配方法(LPM)。其核心思想是对于一个正确匹配点,其邻域范围内的其他匹配点与对应目标点之间的变换关系,应该和正确的匹配点保持一致,而错误匹配点,则应该有较大的…

第一章《初学者问题大集合》第6节:IntelliJ IDEA的下载与安装

当完成了Java开发环境之后,各位读者就可以开始编写第一个Java程序了。可是应该在哪里写程序呢?早期的开发者们都是用纯文本编辑工具编写Java程序,并且在命令行窗口中编译和运行Java程序。时至今日,我们早已远离了那个程序开发的“…

CentOs程序环境准备

1. MySQL的安装启动 选择指定操作系统指定版本的mysql进行下载 MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/5.7.html#downloads 选择复制下载链接 回到终端,执行此命令下载 wget https://dev.mysql.com/get/Downloads/MyS…

举个栗子~Tableau 技巧(244):用和弦图(Chord diagram)呈现数据关系

关于和弦图 和弦图(Chord diagram)常用来表示数据之间的相互关系。数据点沿着圆圈分布,通过点和点之间相互连接的弧线来呈现相互之间的关系。和弦图从视觉上来说比较美观,数据呈现又很直观,所以深受数据粉喜爱。 之前…

【Linux初阶】Linux调试器-gdb使用 | gdb的 l/b/info/d/r/n/s/bt/finish/p/(un)display/q

🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux初阶】 ✒️✒️本篇内容:gdb使用相关背景知识,gdb的使用(打断点、查断点、消断点、调试运行、查看对应变量&…

【python拼图游戏】图片自选,来挑战一下自己的极限吧~

嗨害大家好鸭!我是小熊猫❤ 拼图的画面多以自然风光、建筑物以及一些为人所熟识的图案的为题材。 城堡和山峦是两类传统的主题, 不过任何图画和影像都可以用做拼图的素材。 有一些公司还提供将私人摄影作品制成拼图的服务。 今天我小熊猫就给带来py…

FFmpeg5.1 解码rtsp 并用OpenCV 播放

RTSP 连接过程如下图 看下实际过程中FFmpeg 的日志情况: [tcp 0000014CC3256D40] No default whitelist set [tcp 0000014CC3256D40] Original list of addresses: [tcp 0000014CC3256D40] Address ::1 port 8554 [tcp 0000014CC3256D40] Address 127.0.0.1 po…

使用BP神经网络、RBF神经网络以及PSO优化的RBF神经网络对数据进行预测(Matlab代码实现)

🍒🍒🍒欢迎关注🌈🌈🌈 📝个人主页:我爱Matlab 👍点赞➕评论➕收藏 养成习惯(一键三连)🌻🌻🌻 🍌希…

Keysight是德科技E5061B网络分析仪-安泰测试

E5061B ENA系列网络分析仪从5Hz 至3GHz提供了广泛的频率范围。它不仅支持一般的射频应用(例如滤波器或放大器测量等),还支持低频应用(例如直流至直流转换器环路增益测量)。因此,它是所有实验台上进行网络分析的最重要工具。 拥有E5061B,您就…

Selenium4 新特性

一、Selenium4 简介 Selenium是一个综合性项目,包含一系列的工具和库,支持Web浏览器的各种自动化操作: 软件测试爬虫领域RPA领域优点: 开源:https://github.com/SeleniumHQ兼容性: Chrome、FireFox、Edeg、IE、Opera、Safari支持多种编程语言:Java、Python、C#、Ruby、…

Charles抓包web、手机、小程序配置

一、下载地址 二、web抓包 Charles Web抓包,启动Charles会自动与浏览器设置成代理,不需要进行过多的设置。接下来就是通过浏览器发送网络请求,Charles就会直接抓取到这些信息和响应信息。 1、抓取HTTPS协议 Charles配置 点击顶部菜单栏【He…

双功能螯合剂p-NCS-Bz-DFO,1222468-90-7,p-SCN-Bn-Deferoxamine特点分析

●外观以及性质: p-SCN-Bn-Deferoxamine属于双功能螯合剂,西安凯新生物科技有限公司是各种修饰性PEG供应商,提供各种品质优良PEG衍生物,分子量从1000-40000不等,纯度≥95%,发货速度快。 ●中文名&#xff…

Web学习笔记-React

笔记内容转载自AcWing的Web应用课讲义,课程链接:AcWing Web应用课。 CONTENTS1. React配置环境2. ES6语法补充3. Components1. React配置环境 React官网:React。 React是一个声明式,高效且灵活的用于构建用户界面的JavaScript库…

凡事预则立,不预则缺货!2022年底了核芯物联蓝牙AOA定位基站GA25缺货!GA10缺货!GA60也缺货!

凡事预则立,不预则缺货!2022年底了核芯物联蓝牙AOA定位基站GA25缺货!GA10缺货!GA60也缺货! 核芯物联岳毅恒 ​ 深圳核芯物联科技有限公司 战略合作拓展总监 凡事预则立,不预则缺货!202222年底…

brython | 初探鼠标事件-1:点击事件

各位前端大佬勿笑话,运维小弟献丑了。 前段时间看见大佬使用【文言文】写了一个连连看,于是我也想用【brython】也实现一个连连看。 于是乎,你们就看到这篇文章和这个项目了。 如果大佬们对brython不是特别了解的话,建议先查看之…

JVM分析工具

JVM在运行过程中,我们可以利用各种工具对JVM进行分析,这是性能调优的利器。可以通过各种工具了解在系统运行过程中,在JVM底层到底发生了什么。JVM分析工具一般分为两种,一种是命令行工具,一种是图形界面工具。 JVM分析…