数据结构:栈和队列详解(上)

ops/2025/1/21 17:27:09/

一.栈

1.概念与结构:

栈:一种特殊的线性表,只允许在顺序表的一段插入和删除数据,进行插入和删除的一端叫做栈顶,另外一端则叫做栈底,而我们将在栈顶插入数据叫做压栈(入栈或进栈),在栈底删除数据则叫做出栈

栈的实现可以通过链表和数组实现,但数组在尾插时相对于需要遍历链表才能尾插的链表结构而言拥有更小的时间复杂度,所以栈的实现一般使用数组实现

2.栈的实现:

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>//定义栈的结构
typedef int STDataType;
typedef struct Stack
{STDataType* arr;int top;      //指向栈顶的位置int capacity;//栈的容量
}ST;//栈的初始化
void STInit(ST* ps);
//栈的销毁
void STDestory(ST* ps);
//入栈
void StackPush(ST* ps, STDataType x);
//判断栈是否为空(配合确定top--至0(栈底)的限制条件)
bool StackEmpty(ST* ps);
//出栈
void StackPop(ST* ps);
//取栈顶数据
STDataType StackTop(ST* ps);
//获取栈中有效元素个数
STDataType STsize(ST* ps);
//栈的初始化
void STInit(ST* ps)
{ps->arr = NULL;ps->capacity = ps->top = 0;
}
//栈的销毁
void STDestory(ST*ps)
{if (ps->arr){free(ps->arr);}ps->arr = NULL;ps->capacity = ps->top = 0;
}
//入栈
void StackPush(ST* ps, STDataType x)
{assert(ps);//空间不够if (ps->capacity == ps->top){//扩容STDataType newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;STDataType* tmp = (STDataType*)realloc(ps->arr, newcapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc failed");exit(1);}ps->arr = tmp;ps->capacity = newcapacity;}//空间足够ps->arr[ps->top++] = x;ps->capacity++;
}
//判断栈是否为空
bool StackEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}
//出栈
void StackPop(ST* ps)
{assert(!StackEmpty(ps));--ps->top;--ps->capacity;
}
//获取栈顶元素
STDataType StackTop(ST* ps)
{assert(!StackEmpty(ps));return ps->arr[ps->top-1];
}
//获取栈中元素个数
STDataType STsize(ST* ps)
{assert(ps);return ps->top;
}

以上是栈的实现中所有涉及的函数及函数实现

3.与栈有关的算法题(有效的括号):

原题来源:https://leetcode.cn/problems/valid-parentheses/description/

这题的主要思路就是通过创建一个栈,然后在对输入的一串字符串进行遍历入栈,首先是使其中的一个栈的入栈条件为”是左括号“,如果遍历出的下一个是与之对应的右括号,则使先前入栈的左括号出栈,以此类推,直至字符串遍历完成,如果此时栈为空,则说明字符串符符合题意并且返回true,若不为空,则返回false,整体来看,代码总体上会以字符串的遍历以及栈的输入输出为整体架构,并且伴随着对特殊情况1:”空栈“特殊情况2:”字符串遍历完后栈中是否还有元素残留“的讨论,前者应当置于字符串遍历过程中字符元素与栈元素的对比之前,因为对比就意味着要从栈里读取元素,而空栈是无法读取的,后者则应当置于尾部,在对比机制完整之后以防止”【】{“(类似这种情况)的产生,同时还有一点值得注意的就是每次排除一种错误情况时都不要忘记销毁栈(因为栈的插入涉及到对空间的申请,而不及时释放空间就很容易产生内存泄漏问题)


//栈的初始化
void STInit(ST* ps)
{ps->arr = NULL;ps->capacity = ps->top = 0;
}
//栈的销毁
void STDestory(ST* ps)
{if (ps->arr){free(ps->arr);}ps->arr = NULL;ps->capacity = ps->top = 0;
}
//入栈
void StackPush(ST* ps, STDataType x)
{assert(ps);//空间不够if (ps->capacity == ps->top){//扩容int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;STDataType* tmp = (STDataType*)realloc(ps->arr, newcapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc failed");exit(1);}ps->arr = tmp;ps->capacity = newcapacity;}//空间足够ps->arr[ps->top++] = x;ps->capacity++;
}
//判断栈是否为空
bool StackEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}
//出栈
void StackPop(ST* ps)
{assert(!StackEmpty(ps));--ps->top;--ps->capacity;
}
//获取栈顶元素
char StackTop(ST* ps)
{assert(!StackEmpty(ps));return ps->arr[ps->top - 1];
}
//获取栈中元素个数
int STsize(ST* ps)
{assert(ps);return ps->top;
}bool isValid(char* s) {
ST st;
STInit(&st);
char* pi = s;
//遍历字符串
while (*pi != '\0')
{//左括号入栈if (*pi == '{' || *pi == '[' || *pi == '('){StackPush(&st, *pi);}else{//右括号取栈顶并匹配//先判断是否为空if (StackEmpty(&st)){STDestory(&st);return false;}char tmp = StackTop(&st);if (tmp == '{' && *pi! = '}' || tmp == '(' && *pi! = ')' || tmp == '[' && *pi! = ']'){STDestory(&st);return false;}StackPop(&st);}pi++;
}
//如果栈为空,说明所有的括号都匹配完了,反之为非有效字符串
bool ret = StackEmpty(&st) ? true : false;
STDestory(&st);
return ret;
}


http://www.ppmy.cn/ops/151958.html

相关文章

一次理清楚Java中的日期和时间

Java中的日期和时间 概述 学习最大的问题困难在于沉下心&#xff0c;现实社会纷乱复杂&#xff0c;充满诱惑&#xff0c;同时随着成家立业年岁增长更无当年之志&#xff0c;顿感无力。回想公瑾当年之言&#xff1a;“日抚谣琴听音&#xff0c;夜有娇妻伴读&#xff0c;此生足矣…

MCU中的LSB、MSB和大端模式、小端模式

第一章 LSB和MSB 1.1 最低有效位(Least Significant Bit, LSB) 红外接收器接收了0x45&#xff08;0100 0101&#xff09;之后&#xff0c;怎么将这个数据发送给MCU; LSB&#xff08;least significant bit&#xff09;&#xff1a;最低有效位优先&#xff0c;例如红外通信是以…

.Net Core webapi 实现JWT认证

文章目录 需求准备创建JWT配置创建JWTService注册JWT创建中间件读取jwt的token在需要的接口上添加属性启动认证启动swagger的授权认证使用 需求 实现一个记录某个用户所有操作的功能 准备 创建你的webapi项目从nuget下载安装JWT资源包根据你的项目使用.net版本下载对应的jwt…

Kotlin Bytedeco OpenCV 图像图像57 图像ROI

Kotlin Bytedeco OpenCV 图像图像57 图像ROI 1 添加依赖2 测试代码3 测试结果 1 添加依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns"http://maven.apache.o…

使用 HTML 开发 Portal 页全解析

前言 在当今数字化时代&#xff0c;网站作为企业和个人展示信息、提供服务的重要窗口&#xff0c;其重要性不言而喻。而 Portal 页&#xff0c;作为网站的核心页面之一&#xff0c;承担着引导用户、整合信息等关键任务。那么&#xff0c;如何使用 HTML 开发一个功能齐全、界面…

【HarmonyOS NAPI 深度探索11】搭建 NAPI 开发环境:HarmonyOS DevEco Studio 全指南

【HarmonyOS NAPI 深度探索11】搭建 NAPI 开发环境&#xff1a;HarmonyOS DevEco Studio 全指南 在开始 NAPI 开发之前&#xff0c;一个高效、完善的开发环境是成功的第一步。对于 HarmonyOS 开发者来说&#xff0c;DevEco Studio 是最推荐的开发工具&#xff0c;它为 Harmony…

【开源免费】基于SpringBoot+Vue.JS夕阳红公寓管理系统(JAVA毕业设计)

本文项目编号 T 146 &#xff0c;文末自助获取源码 \color{red}{T146&#xff0c;文末自助获取源码} T146&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

基于Python机器学习的双色球数据分析与预测

python统计分析2003-2024年所有的中奖记录,通过人工智能机器学习预测双色球,个人意见,仅供参考. 声明&#xff1a;双色球具有随机性&#xff0c;任何工具无法预测。本文章仅作为技术交流&#xff0c;提供学习参考。本文所涉及的代码均为python之机器学习的代码。双色球为公益事…