数据结构篇3—《龙门客“栈”》

在这里插入图片描述

文章目录

  • 🚩前言
    • 1、栈的概念
    • 2、栈的实现框架
    • 3、栈的代码实现
      • 3.1、栈的初始化和销毁
      • 3.2、入栈\出栈\返回栈顶元素\元素个数\判空
      • 3.3、栈定义注意事项
    • 4、栈的应用实例——《括号匹配问题》

🚩前言

前面记录了关于顺序表和链表的数据结构,这一篇文章就来说一下“栈”这一个数据结构。当然不是什么龙门客栈了哈哈。接下来就来实现一下栈这个结构吧,并用实例来展示栈的应用!✌

1、栈的概念

栈 :一种特殊的线性表,在存储数据的时候和顺序表以及单链表有所区别。我们通过图来展示:
在这里插入图片描述

2、栈的实现框架

在这里插入图片描述

3、栈的代码实现

该栈的实现是用顺序表的结构,模拟实现栈。

3.1、栈的初始化和销毁

void STInit(ST* pst)
{
	assert(pst);
	pst->a = NULL;//此处可以给空间,也可以先不给,
	//在插入的时候再给。
	pst->capacity = 0;
	pst->size = 0;
}

void STDestory(ST* pst)
{
	assert(pst);
	free(pst->a);
	pst->a = NULL;
	pst->capacity = 0;
	pst->size = 0;
}

3.2、入栈\出栈\返回栈顶元素\元素个数\判空

void STPush(ST* pst, STDataType data)
{
	assert(pst);
	if (pst->top == pst->capacity)
	{
		int NewCapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
		
		STDataType* tmp = 
		(STDataType*)realloc(pst->a,NewCapacity*sizeof(STDataType));
		
		if (tmp == NULL)
		{
			perror("STPush::realloc fail!");
			return;
		}
		else
		{
			pst->a = tmp;
			pst->capacity = NewCapacity;
		}
	}
	pst->a[pst->top++]=data;
}

void STPop(ST* pst)
{
	assert(pst && pst->top > 0);
	pst->top--;
}


STDataType STTop(ST* pst)
{
	assert(pst&&pst->top);
	return pst->a[pst->top - 1];
}

int STSize(ST st)
{
	assert(&st);
	return st.top;
}

bool STEmpty(ST st)
{
	assert(&st);
	return st.top == 0;
}

3.3、栈定义注意事项

①对于top初值的大小:
在这里插入图片描述

4、栈的应用实例——《括号匹配问题》

oj括号匹配问题

思路:
①首先括号匹配需要考虑两个点:数量上匹配和方向上匹配(左括号要匹配右括号)。
②利用栈结构实现该题:只要是左括号(全部类型的),就入栈;如果遇到右括号,则出栈顶元素(也就是和栈顶左括号进行匹配)。在这我们直接判断不匹配是情况,就是只判断不匹配情况,匹配的情况不用管。
代码如下:

bool isValid(char* s) {
    ST st;
    STInit(&st);
    while(*s!='\0')
    {
        if((*s=='(') || (*s=='{') || (*s=='['))
        {
            STPush(&st,*s);
        }
        else
        {
            if(STEmpty(&st))
            {
                return false;
                STDestory(&st);
            }
            DataType ret=GetTopElement(&st);
            STPop(&st);

            if((ret == '(' && *s != ')')
            ||(ret == '{' && *s != '}')
            ||(ret == '[' && *s != ']'))
            {
                return false;
            }
        }
        s++;
    }
    return STEmpty(&st);
   STDestory(&st);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

容器安全在云原生的安全上有什么大作为

进入后云计算时代,云原生正在成为企业数字化转型的潮流和加速器。云原生安全相关的公司雨后春笋般建立起来,各个大云厂商也积极建立自己云原生的安全能力,保护云上客户的资产。 与之相对的,黑产组织为了牟利,也在不断…

低功耗设计

设计电路谁都会,但是设计低功耗电路,降低芯片功耗却是难题 - 哔哩哔哩 (bilibili.com) 一个产品的低功耗设计,并不仅仅只是采用一个低功耗的MCU就能解决的问题。产品的低功耗,不久取决于MCU的低功耗,也取决于低功耗的…

QT状态机4-使用并行状态来避免组合爆炸

#include "MainWindow.h" #include "ui_MainWindow.h"MainWindow::MainWindow(QWidget *parent):

别再找了!吐血整理ChatGPT 3.5/4.0新手使用手册

引领科技潮流的ChatGPT早已名声在外,如今获取ChatGPT已变得触手可及,但很多人还多次提问如何使用chatgpt,为了避免陷入误区,本文旨在为广大ChatGPT爱好者提供一份实用的指南。 因此,帮助大家更好地掌握其使用技巧&…

Leecode热题100---11:盛最多水的容器

题目: 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明:你不能倾…

linux使用教程(命令介绍、命令格式和命令的使用技巧)

一、命令的格式 1.1 打开终端的方式 ubuntu中的命令基本都是在终端执行的 打开终端的方式: 第一种方法:在ubuntu桌面中鼠标右键选择“打开终端” 第二种方法:使用快捷键ctrl alt t 1.2 终端提示符 stuqfedu:~$ 对于这个提示符 stu&…

PSAI超强插件来袭:一键提升设计效率!

无需魔法,直接在PS中完成图生图、局部重绘、线稿上色、无损放大、扩图等操作。无论你是Windows还是Mac用户,都能轻松驾驭这款强大的AI绘图工具,这款PSAI插件让你的设计工作直接起飞! 在之前的分享中,我为大家推荐过两…

大白话!大模型(LLMs)私有化的三种方式:Prompts、Embeddings、Fine-tuning

私有化大模型的三种方式 随着我们使用大模型的深入呢,我们会发现这样一个现象,我们正常情况下问大模型的问题,会得到一个非常普适的回答,就是大模型会根据自己的训练的这个过往的一些知识的积累,然后告诉我们他认为最…

webpack优化构建速度示例-externals:

externals 配置项主要用于防止将某些 import 的包(package)打包到 bundle 中,而是在运行时(runtime)再从外部获取这些扩展依赖(external dependencies)。这样做的主要目的是为了解决打包文件过大…

抖店商品退货率比较高,怎么解决?

我是王路飞。 抖店的退货率高,怎么解决呢? 当然是看情况,然后换产品、换厂家啊,不然换店铺吗? 要知道,做电商,产品可以死,店铺不能死,不然做起来太累了,也…

揭秘未来工厂核心:智慧大屏引领可视化管理新潮流

在数字化浪潮席卷全球的今天,智慧工厂已不再是科幻小说中的概念,而是成为了现代工业发展的新引擎。 智慧工厂可视化大屏,不仅仅是一块显示屏,更是工厂运行的“大脑”。通过这块屏幕,我们可以实时掌握工厂的每一个角落、…

(规格参考)ADP5360ACBZ-1-R7 电量计 电池管理IC,ADP5072ACBZ 双通道直流开关稳压器,ADL5903ACPZN 射频检测器

1、ADP5360ACBZ-1-R7:具有超低功耗电量计、电池保护功能的先进电池管理PMIC 功能:电池保护 电池化学成份:锂离子/聚合物 电池数:1 故障保护:超温,过压 接口:I2C 工作温度:-40C ~ 85…

Java 插入数据到Elasticsearch中进行各种类型文档的内容检索

源码下载&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1D3yszkTzjwQz0vFRozQl2g?pwdz6kb 提取码&#xff1a;z6kb 实现思路 1.搭建一个新的springboot项目&#xff0c;不会的请看我这篇博客&#xff1a;springboot项目搭建 2.添加maven依赖 <dependency><…

【嵌入式大赛应用赛道】机械手臂

电机 进步电机&#xff1a;它的转动是以确定的步数进行的&#xff0c;只要计算好脉冲数量和频率&#xff0c;就可以准确预测和控制电机的转动角度、速度以及停止的位置 伺服电机&#xff1a;将输入的电信号&#xff08;如电压或电流指令&#xff09;转换成轴上的精确旋转运动…

怎么将视频转成图片?看看这个网站

在日常生活中我们常常会在一些特定的场合下想要将一些视频中某个场合瞬间提取出来做成动态图片。Gif动图作为我们日常生活、工作必不可少的&#xff0c;想要通过自己制作这种有动态效果的图片就可以用gif动画制作网站&#xff0c;不用下载软件&#xff0c;手机、pc都可以在线操…

【Linux网络编程】IO多路转接之poll

poll 1.poll初始2.poll函数接口3.poll服务器4.poll的优点缺点 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.poll初始 poll也是一种linux…

JumpServer堡垒机简单式部署与管理(v3.10.8)

一. 环境准备 准备一个新的虚拟机&#xff08;ip&#xff1a;192.168.226.133&#xff09; 1.1 关闭防火墙 systemctl stop firewalld systemctl disable firewalld 1.2 永久关闭SEliunx sed -i s/^SELINUX.*/SELINUXdisabled/ /etc/selinux/config 1.3 重启虚拟机让seliu…

2024年网络安全威胁

随着2024年的到来&#xff0c;数字世界的版图正在以前所未有的速度扩张&#xff0c;引领我们进入一个技术革新的新时代。然而&#xff0c;这飞速的发展同时也催生了一系列错综复杂的网络安全挑战。在这个数字平台与我们生活日益紧密交织的时代&#xff0c;深入了解这些新兴的威…

开发板连接电机,烧坏芯片的原因、解决

当使用开发板、核心板&#xff0c;连接电机驱动板&#xff0c;控制电机的转动&#xff0c;会很容易烧芯片。 极少数是通电就烧坏&#xff0c;有些是调试了一段时间才烧&#xff0c;也有些是稳定运行好些日子突然烧了...... 百度搜索&#xff1a;“STM32 电机 烧坏”&#xff…

【C++算法】堆相关经典算法题

1.最后一块石头的重量 其实就是一个模拟的过程&#xff1a;每次从石堆中拿出最大的元素以及次大的元素&#xff0c;然后将它们粉碎&#xff1b;如果还有剩余&#xff0c;就将剩余的石头继续放在原始的石堆里面重复上面的操作&#xff0c;直到石堆里面只剩下一个元素&#xff0c…