栈PART 1

news2024/10/6 5:57:47

目录

1. 栈

1.1 栈的概念和结构

1.2 栈的实现

1.2.1 栈的顺序储存结构

1.2.2 栈的基本操作

1.3 有效的括号


1. 栈

1.1 栈的概念和结构

堆栈又名栈(stack),它是一种运算受限的线性表。

限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。

向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;

从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

入数据在栈顶,出数据也在栈顶。

1.2 栈的实现

栈的实现一般可以使用数组或者链表来实现,两者相比较的话,数组的结构实现更优。

1.2.1 栈的顺序储存结构

typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;

1.2.2 栈的基本操作

(1)初始化

//Stack.h

//初始化
void STInit(ST* ps);
//Stack.c

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

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

注意:这里 top 的值可以是0,或者是-1。

两种写法的区别在于:

这两种写法没有好坏之分。

(2)销毁

//Stack.h

//销毁
void STDestroy(ST* ps);
//Stack.c

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

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

(3)入栈

//Stack.h

//入栈
void STPush(ST* ps, STDataType x);
//Stack.c

void STPush(ST* ps, STDataType x)
{
	assert(ps);
    //如果栈满,扩容
	if (ps->top == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(ps->a, newcapacity * sizeof(STDataType));
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}

		ps->a = tmp;
		ps->capacity = newcapacity;  //更新栈的容量
	}

	ps->a[ps->top] = x;
	ps->top++;  //将元素x插入栈中,并且将栈顶指针上移一位
}

(4)出栈

//Stack.h

//出栈
void STPop(ST* ps);
//Stack.c

void STPop(ST* ps)
{
	assert(ps);
	assert(!STEmpty(ps));  //栈不为空

	ps->top--;  //栈顶指针向后移一位
}

(5)读取栈顶元素

//Stack.h

//读取栈顶元素
STDataType STTop(ST* ps);
//Stack.c

STDataType STTop(ST* ps)
{
	assert(ps);
	assert(!STEmpty(ps));

	return ps->a[ps->top - 1];  //因为前面定义的 top = 0
}

(6)返回栈的长度

//Stack.h

//返回栈的长度
int STSize(ST* ps);
//Stack.c

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

	return ps->top;
}

(7)判断栈是否为空

//Stack.h

//判断栈是否为空
bool STEmpty(ST* ps);
//Stack.c

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

1.3 有效的括号

 

示例代码:

typedef char STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;

//初始化
void STInit(ST* ps);
//销毁
void STDestroy(ST* ps);

//入栈
void STPush(ST* ps, STDataType x);
//出栈
void STPop(ST* ps);

//读取栈顶元素
STDataType STTop(ST* ps);

//栈的大小
int STSize(ST* ps);

//判断栈是否为空
bool STEmpty(ST* ps);

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

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

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

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

void STPush(ST* ps, STDataType x)
{
	assert(ps);

	if (ps->top == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(ps->a, newcapacity * sizeof(STDataType));
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}

		ps->a = tmp;
		ps->capacity = newcapacity;
	}

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

void STPop(ST* ps)
{
	assert(ps);
	assert(!STEmpty(ps));

	ps->top--;
}

STDataType STTop(ST* ps)
{
	assert(ps);
	assert(!STEmpty(ps));

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

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

	return ps->top;
}

bool STEmpty(ST* ps)
{
	assert(ps);

	return ps->top == 0;
}

bool isValid(char* s) {
    ST st;
    STInit(&st);
    while(*s)
    {
        if (*s == '(' || *s == '[' || *s == '{')
        {
            STPush(&st, *s);
        }
        else
        {
            //右括号比左括号多
            if(STEmpty(&st))
            {
                STDestroy(&st);
                return false;
            }

            char top = STTop(&st);
            STPop(&st);

            //符号不匹配
            if((*s == ']' && top != '[')
             || (*s == ')' && top != '(')
             || (*s == '}' && top != '{'))
            {
                STDestroy(&st);
                return false;
            }
        }

        ++s;
    }
    //左括号比右括号多,栈不为空
    bool ret = STEmpty(&st);
    STDestroy(&st);
    return ret;
}

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

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

相关文章

3d中如何对模型粉碎处理?---模大狮模型网

在3D建模和动画设计中,模型粉碎处理是一种引人注目的效果,可以为场景增添动态和震撼的视觉效果。无论是用于电影特效、游戏设计还是虚拟现实项目,都可以通过模型粉碎处理来创造出引人入胜的场景。本文将介绍如何在3D中轻松实现模型粉碎处理&a…

FastText 算法原理及使用方法

文章目录 1. 前言2. 模型架构2.1 Hierarchical Softmax2.2 n-gram 特征 3. 训练及评估4. 使用5. 参考 1. 前言 FastText 是一个由 Facebook AI Research 在2016年开源的文本分类器,它的设计旨在保持高分类准确度的同时,显著提升训练和预测的速度。 论文…

Day_3

1. HttpClient HttpClient是Apache的一个子项目&#xff0c;是高效的、功能丰富的支持HTTP协议的客户端编程工具包 作用&#xff1a;发送HTTP请求&#xff0c; 接受相应数据 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>…

森林消防—高扬程水泵:守护绿色屏障的专业利器/恒峰智慧科技

在广袤的森林中&#xff0c;火灾无疑是最具破坏性的灾难之一。为了及时应对森林火灾&#xff0c;保护珍贵的自然资源和生态平衡&#xff0c;高效的消防设备显得尤为重要。森林消防高扬程水泵便是其中一款专业设备&#xff0c;以其高效输送水源的能力&#xff0c;成为守护森林绿…

【服务治理中间件】consul介绍和基本原理

目录 一、CAP定理 二、服务注册中心产品比较 三、Consul概述 3.1 什么是Consul 3.2 Consul架构 3.3 Consul的使用场景 3.4 Consul健康检查 四、部署consul集群 4.1 服务器部署规划 4.2 下载解压 4.3 启动consul 五、服务注册到consul 一、CAP定理 CAP定理&#xff…

hexo 博客插入本地图片时遇到的坑

哈喽大家好&#xff0c;我是咸鱼。 最近一直在折腾博客的事&#xff0c;说是 hexo 极易上手&#xff0c;我觉得只仅限于在安装部署的时候&#xff0c;随着对 hexo 的深入使用&#xff0c;发现遇到的问题还是挺多的。 那今天来讲一下我在把本地图片插入到 hexo 博客文章中遇到…

网络安全之二层局域网封装及广域网封装详解

局域网封装&#xff1a;Ethernet2&#xff08;TCP/IP&#xff09;&#xff0c;IEEE802.3&#xff08;OSI&#xff09;&#xff08;前面文章中讲解了TCP、IP和OSI本文就不继续讲解&#xff1a;可以查看&#xff1a;网络安全之OSI七层模型详解-CSDN博客&#xff09; 广域网封装&…

SD-WAN大型企业异地组网与海外访问案例解析

随着大型企业不断扩张&#xff0c;其分公司遍布各地&#xff0c;但异地网络访问的瓶颈日益凸显。若企业还需依赖外网进行业务交流&#xff0c;那么合规、高效的SD-WAN组网方案便显得尤为重要。 客户概述&#xff1a; 该客户专注于无线通讯技术的研发与推广&#xff0c;拥有位于…

TL062CDR 贴片SOP-8 丝印TLO62C 双路通用运算放大器芯片

TL062CDR是一款非常通用的运算放大器&#xff0c;它可以被广泛应用在各种电子产品和系统中。以下是一些可能使用TL062CDR的具体产品类别和应用示例&#xff1a; 1. 模拟滤波器&#xff1a;在音频设备&#xff0c;如耳机放大器、音响系统和声音处理器中&#xff0c;TL062CDR可以…

对Windows超融合S2D的一些补充

先说一个不知道算不算BUG的例子&#xff0c;下面这个存储池是用两台服务器各2块10G建立的&#xff0c;除去系统保留的部分&#xff0c;显示还有13G可用。 但如果使用其新建虚拟磁盘会显示可用的空间为0 然后我又各增加了一块10G硬盘进池&#xff0c;变成了可用空间为30.5GB …

VM 安装Ubuntu20

1、VM 新建虚拟机 类型配置 - 典型 安装源选择 &#xff08;安装包获取&#xff1a;Ubuntu桌面系统 | Ubuntu&#xff09; 设置计算机名与用户账号密码 为虚拟机命一个名&#xff0c;设置虚拟机文件保存的位置 设置磁盘相关信息 最后一步&#xff0c;确定虚拟机的相关参数 设置…

ansible-3

目录 一、Templates 模块 1.1.先准备一个以 .j2 为后缀的 template 模板文件&#xff0c;设置引用的变量 1.2.修改主机清单文件&#xff0c;使用主机变量定义一个变量名相同&#xff0c;而值不同的变量 1.3.编写 playbook 二、tags 模块 三、Roles 模块 四、编写模块 4…

10、算数运算符(以 ‘/’、‘%’、‘++’为主去讲解)(Java超详细版本)

算数运算符 一、算数运算符二、“ / ”的使用三、“ % ”的使用四、“ ”的使用⭐ 一、算数运算符 算数运算符是对数值类型的变量进行运算的&#xff0c;在Java程序中使用的非常多的。 二、“ / ”的使用 1、Java中 “ / ” 的运算结果是省略小数部分的整数&#xff0c;不存…

【人工智能】博弈搜索(极小极大值、α-β剪枝)

1. 极小极大值算法 人工智能中 “博弈” 通常专指博弈论专家们称为有完整信息的、确定性的、轮流行动的、两个游戏者的零和游戏&#xff08;如国际象棋)。术语中&#xff0c;这是指在确定的、完全可观察的环境中两个 Agent必须轮流行动&#xff0c;在游戏结束时效用值总是相等并…

MCP3008-I/SL 模数转换器ADC SPI接口 模拟信号采集

MCP3008-I/SL 模数转换器ADC 贴片SOIC16 MCP3008-I/SL 是一款模数转换器&#xff08;ADC&#xff09;&#xff0c;属于 SAR&#xff08;逐次逼近寄存器&#xff09;架构的 ADC。它具有以下特点&#xff1a; 8 通道单 ADC 最大采样率&#xff1a;200ksps&#xff08;千样点每秒…

MySQL-ELK基础

1&#xff1a;什么是 ELK ELK是由一家elastic公司开发的三个开源项目的首字母缩写&#xff0c;这三个项目分别是&#xff1a;Elasticsearch、Logstash 和 Kibana。三个项目各有不同的功能&#xff0c;之后又增加了许多新项目, 于是 从5.X版本后改名为Elastic Stack Elastic S…

STM32CubeMX学习笔记32---FreeRTOS资源管理

一、CPU利用率简介 1 基本概念 CPU 使用率其实就是系统运行的程序占用的 CPU 资源&#xff0c;表示机器在某段时间程序运行的情况&#xff0c;如果这段时间中&#xff0c;程序一直在占用 CPU 的使用权&#xff0c;那么可以人为 CPU 的利用率是 100%。CPU 的利用率越高&#xf…

C语言:__attribute__((packed))

一、简介 在使用结构体的时候&#xff0c;经常要根据结构体的长度来进行相关判断。但是按照C语言的规则&#xff0c;会对不同类型的数据类型进行自动对齐。有时候就会造成一些问题&#xff0c;如果不需要使用自动对齐的功能&#xff0c;就需要使用到本章的关键字。 二、自动对…

CFETS系统介绍

CSTP服务是什么 CSTP&#xff08;CFETS Straight Through Process&#xff09;是交易中心为外汇市场提供的数据直通式处理接口服务。用户通过标准式接口将本方交易数据直接从交易中心的服务器接收下来&#xff0c;根据需要对数据进行处理并导入到中、后台系统。其基本功能包括…

【JUC】并发编程 Synchronized 锁升级原理

Synchronized如何实现同步/互斥的效果&#xff1f; monitorenter&#xff1a; 将锁对象对象头中Mark Word的前30bit替换成指向操作系统中与其关联的monitor对象&#xff0c;将锁记录位状态改为10 monitorexit&#xff1a; 将锁对象对象头中Mark Word进行重置&#xff0c;重新恢…