手撕数据结构之栈+例题

news2024/10/7 4:25:19

目录

一、栈的概念及结构

二、栈的头文件及基本框架

三、接口实现

1、对栈的初始化

 2、栈的销毁

3、入栈操作

4、出栈操作

 5、判断栈是否为空

6、返回栈顶元素

7、遍历栈

四、有效的括号 - 力扣(LeetCode)

题目描述:

 思路:

代码:


一、栈的概念及结构

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

如同子弹夹,我们进行添子弹和出子弹,很形象。

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

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

 接下来,我们以数组栈的形式去模拟。

二、栈的头文件及基本框架

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>

typedef int STDataType;

typedef struct Stack
{
	STDataType* a;//就是以a开头的一段连续的空间
	int top;//定义栈顶位置
	int capacity;
}ST;

void SLInit(ST* ps);
void SLDestroy(ST* ps);
void STPush(ST* ps, STDataType x);
void STPop(ST* ps);
int STSize(ST* ps);
bool STEmpty(ST* ps);
STDataType STTop(ST* ps);//获取栈顶元素

三、接口实现

1、对栈的初始化

void SLInit(ST* ps)
{
	ST* ret = (ST*)malloc(4 * sizeof(ST));
	if (ret == NULL)
	{
		perror(malloc);
		exit(-1);
	}
	ps->a = ret;
	ps->capacity = 4;
	ps->top = 0;
}

 2、栈的销毁

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

3、入栈操作

void STPush(ST* ps, STDataType x)
{
	assert(ps != NULL);
	//检查需不需要扩容
	if (ps->top == ps->capacity)
	{
		ps->capacity += 4;
		ST* ret = (ST*)realloc( ps->a, sizeof(ST) * ps->capacity);
		if (ret == NULL)
		{
			perror(realloc);
			exit(-1);
		}
		ps->a = ret;
	}
	ps->a[ps->top] = x;
	ps->top++;
}

4、出栈操作

void STPop(ST* ps)
{
	assert(ps);
	ps->top--;
}

 5、判断栈是否为空

bool STEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
    如果右边等式成立返回true,反之返回false
}

6、返回栈顶元素

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

7、遍历栈

不同于其他数据结构,遍历栈不用print

//遍历栈的特殊方式
	while (!STEmpty(&ps))
	{
		printf("%d ", STTop(&ps));
		STPop(&ps);
	}

四、有效的括号 - 力扣(LeetCode)

题目描述:

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

 思路:

如果是左括号就入栈,如果是右括号就与栈顶元素进行比较。这样就正好匹配题目的要求,但博主目前没有学过STL库,所以只能将上面的手撕栈CV一下啦,下面的代码为了避免冗余去除掉这一部分~

代码:

bool isValid(char * s)
{
    char* ret = s;
    int num = 0;
    //利用奇数偶数判断数量是否匹配
    while(*ret)
    {
        num++;
        ret++;
    }
    if(num%2 != 0)
    {
        return false;
    }
    ST ps;
	SLInit(&ps);
    while(*s)
    {
    switch(*s)
    {
        case '{':
        case '[':
        case '(':
            STPush(&ps,*s);
            break;
        case ')':
        case ']':
        case '}':
            if(STSize(&ps) == 0)
                return false;
            if(*s == ']' && STTop(&ps) != '['||
               *s == ')' && STTop(&ps) != '('||
               *s == '}' && STTop(&ps) != '{')
            {
                SLDestroy(&ps);
                return false;
            }
            STPop(&ps);
            break;
    }
    s++;
    }
    //防止((出现
    if(!STEmpty(&ps))
        return false;
    return true;
}

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

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

相关文章

缓存平均的两种算法

引言 线边库存物料的合理性问题是物流仿真中研究的重要问题之一,如果线边库存量过多,则会对生产现场的布局产生负面影响,增加成本,降低效益。 写在前面 仿真分析后对线边Buffer的使用情况进行合理的评估就是一个非常重要的事情。比较关心的参数包括:缓存位最大值…

Kubernetes集群部署(第二篇)

安装flannel Master 节点NotReady 的原因就是因为没有使用任何的网络插件&#xff0c;此时Node 和Master的连接还不正常。目前最流行的Kubernetes 网络插件有Flannel、Calico、Canal、Weave 这里选择使用flannel。 flannel提取链接&#xff1a;https://pan.baidu.com/s/1fLJKh…

GB28181智慧可视化指挥控制系统之执法记录仪设计探讨

什么是智慧可视化指挥控制系统&#xff1f; 智慧可视化指挥控制平台通过4G/5G网络、WIFI实时传输视音频数据至指挥中心&#xff0c;特别是在有突发情况时&#xff0c;可以指定一台执法仪为现场视频监控器&#xff0c;实时传输当前画面到指挥中心&#xff0c;指挥中心工作人员可…

JVM笔记 —— 出现内存溢出错误时时如何排查

一、出现内存溢出的几种情况 内存溢出错误分为StackOverflowError和OutOfMemoryError&#xff0c;前者是栈中出现溢出&#xff0c;后者一般是堆或方法区出现溢出&#xff0c;简称OOM 1. 栈溢出 StackOverflowError 栈溢出一般都是因为没有正确的结束递归导致的&#xff0c;无…

【Pyhthon实战】Python对全校电费查询采集并可视化分析

前言 今天&#xff0c;我来说说怎么抓取宿舍电费的过程。我们学校是在完美校园交电费的&#xff0c;我们可以不用取抓包完美校园的数据接口&#xff0c;我们可以直接登录学校的一卡通网站&#xff0c;每个学校都有&#xff0c;大家可以自己找找&#xff0c;这里我为什么要抓包呢…

新华日报-北京晚报-天津日报-投稿要求

新华日报-北京晚报-天津日报-投稿要求 报纸出版快 稳妥 价优 《中国教育报》1800字符1-3个月见报 《中国教师报》1800字符1-3个月左右见报 《光明日报》普通版 1500字符左右 各科 2个月见报 《经济日报》普通版 1500字符 1-3个月见报 《法治日报》普通版 2000字符 3个月见报…

基于子口袋的分子生成

生成与靶蛋白具有高结合亲和力的分子&#xff08;也称为基于结构的药物设计&#xff0c;structure-based drug design&#xff09;是药物发现中的一项基本且具有挑战性的任务。最近&#xff0c;深度生成模型在生成以蛋白质口袋为条件的3D分子方面取得了显著成功。然而&#xff…

怎么绘制乡土中国思维导图?了解一下这个绘制步骤

怎么绘制乡土中国思维导图&#xff1f;乡土中国思维导图是一种将中国传统文化与现代思维方法相结合的思维导图。它是一种系统化的思考方法&#xff0c;可以帮助我们更好地理解乡土中国文化的内涵和特点&#xff0c;同时也能帮助我们更好地应对当下的社会和文化问题。那么今天就…

TZOJ 曹冲养猪 (扩展)中国剩余定理

求解&#xff1a; M a1 (b1) M a2 (b2) M a3 (b3) ........ 对于 上述式子我们可以拆成 &#xff1a; M b1 * p a1 b2 * q a2 左右移项得到&#xff1a; b1 * p - b2 * q a2 - a1 可以发现 这就是一个同余方程&#xff1a; a b1 , b b2 , x p , y q , c …

关于新手学习STM32开发应该如何入门?

对于新手来说&#xff0c;学习STM32开发可能会感到困惑&#xff0c;尤其是在拿到开发板后该如何入门。在这里有嵌入式学习路线&#xff0c;毕设&#xff0c;各种项目&#xff0c;需要留个6。以下是部分内容概述&#xff1a;硬件介绍&#xff1a;了解STM32开发板的基本硬件组成和…

Chatgpt API调用报错:openai.error.RateLimitError

Chatgpt API 调用报错&#xff1a; openai.error.RateLimitError: You exceeded your current quota, please check your plan and billing details. 调用OpenAI API接口 import openai import osopenai.api_key os.getenv("OPENAI_API_KEY")result openai.Chat…

欧科云链与华为云达成战略合作,开启Web3安全合规新时代

华为云——作为全球增速最快的主流云服务提供商&#xff1b; 欧科云链——作为全球领先的Web3链上数据及合规解决方案提供商&#xff1b; 今天&#xff0c;华为云 与 欧科云链 正式达成战略合作&#xff01; 两者相加在一起&#xff0c;未来又将会碰撞出怎样的火花&#xff1f;…

01-向量究竟是什么?

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan 向量究竟是什么 引入一些数作为坐标是一种鲁莽的行为 ——赫尔曼外尔 The introduction of numbers as coordinates is an act of violence - Hermann Weyl 向量的定义 向量&#xff0…

代码随想录算法训练营第50天|动态规划part08|139.单词拆分、关于多重背包,你该了解这些!、背包问题总结篇!

代码随想录算法训练营第50天&#xff5c;动态规划part08&#xff5c;139.单词拆分、关于多重背包&#xff0c;你该了解这些&#xff01;、背包问题总结篇&#xff01; 139. 单词拆分 139. 单词拆分 思路&#xff1a; 单词就是物品&#xff0c;字符串s就是背包 拆分时可以重…

【EI复现】考虑区域多能源系统集群协同优化的联合需求侧响应模型(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

远程桌面配置指南:保留TCP地址、配置隧道和使用固定TCP地址

远程桌面配置指南&#xff1a;保留TCP地址、配置隧道和使用固定TCP地址 文章目录 远程桌面配置指南&#xff1a;保留TCP地址、配置隧道和使用固定TCP地址第一步&#xff1a;保留TCP地址第二步&#xff1a;为远程桌面隧道配置固定的TCP地址第三步&#xff1a;使用固定TCP地址远程…

10. Docker Swarm(一)

目录 1、前言 2、Docker Swarm体系架构 2.1、简单介绍 2.2、体系架构 3、简单使用 3.1、环境准备 3.2、初始化master节点 3.3、建立worker节点 3.4、查看集群的节点信息 3.5、部署应用 3.5.1、创建Dockerfile文件 3.5.2、构建镜像 3.5.3、将镜像上传到Docker仓库 …

crypto-js中AES的加解密封装

在项目中安装依赖&#xff1a; npm i crypto-js在使用的页面引入&#xff1a; import CryptoJS from crypto-jscrypto-js中AES的加解密简单的封装了一下&#xff1a; //加密const KEY 000102030405060708090a0b0c0d0e0f // 秘钥 这两个需要和后端统一const IV 8a8c8fd8fe3…

栈和队列OJ题讲解

&#x1f493;博主个人主页:不是笨小孩&#x1f440; ⏩专栏分类:数据结构与算法&#x1f440; 刷题专栏&#x1f440; C语言&#x1f440; &#x1f69a;代码仓库:笨小孩的代码库&#x1f440; ⏩社区&#xff1a;不是笨小孩&#x1f440; &#x1f339;欢迎大家三连关注&…

mysql事务隔离级别详细讲解

mysql事务讲解 MySQL事务处理&#xff08;TransAction&#xff09; 大家好&#xff0c;我是一名热爱研究技术并且喜欢自己亲手实践的博主。 工作这么多年&#xff0c;一直没有深入理解MySQL的事务&#xff0c;因为最近也在面试&#xff0c;准备复习mysql的相关知识&#xff0…