栈的实现及其括号匹配问题

news2024/12/25 9:15:27

栈的实现及其括号匹配问题

  • 一、栈的基本概念及其实现
  • 二、栈的数据结构实现
  • 三、oj题括号匹配问题解答

一、栈的基本概念及其实现

1.什么是栈?
  栈是一种特殊的线性表,只允许栈顶一段插入和删除数据,栈底就是一个容器的底子,栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
基本概念
 压栈:向栈里面放数据(我也叫给栈压数据)
 出栈:从栈顶取数据

1
我对栈的理解
  我把栈理解为一个垃圾桶,入栈把垃圾放进栈内,出栈把栈顶的垃圾取出来!
1

二、栈的数据结构实现

//定义栈
typedef int STDataType;
typedef struct Stack
{
	//存储数据的指针
	STDataType* a;
	//定义栈顶
	int top;
	//定义栈容器的大小
	int capacity;
}ST;

//下面实现常用的接口
//初始化栈,这个一定要初始化,不然栈操作问题很大!
实现的接口:
//初始化栈
void STInit(ST* ps);
//销毁栈
void STDestory(ST* ps);
//给栈压数据
void STPush(ST* ps,STDataType x);
//从栈顶出数据
void STPop(ST* ps);
//获取栈顶元素
STDataTye STTop(ST* ps);
//判断栈是否为空
bool STEmpty(ST* ps);
//获取栈的元素个数
int STSize(ST* ps);

实现上面列出的接口
//栈初始化

//初始化
void STInit(ST* ps)
{
	ps->a = NULL;
	ps->capacity = 0;
	//刚开始是栈顶是0
	ps->top = 0;
}

//销毁栈

//销毁栈 
void STDestory(ST* ps)
{
	free(ps->a);
	ps->a = NULL;
	ps->capacity = ps->top = 0;
}

//给栈压数据,压数据,首先要检测是否容量足够,若不够,直接扩容为原来的2倍,下面压数据

//压数据
void STPush(ST* ps, STDataType x)
{
	if (ps->capacity == ps->top)
	{
		//扩容
		int newcapacity = ps->capacity == 0 ? 4 : 2 * (ps->capacity);
		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++;
}

//出数据,要有数据出,检测栈不为空,当然,传来ps不为NULL,直接top- -

//出数据
void STPop(ST* ps)
{
	assert(ps);
	assert(!STEmpty(ps));
	ps->top--;
}

//获取栈顶元素
//还是检测传来的指针不为NULL,栈不为空,栈若为空就没有元素取了

//获取栈顶元素
STDataType STTop(ST* ps)
{
	assert(ps);
	assert(!STEmpty(ps));
	return ps->a[ps->top - 1];
}

//判空

//判空
bool STEmpty(ST* ps)
{
	return ps->top == 0;
}

//获取元素个数

//获取元素个数
int STSize(ST* ps)
{
	return ps->top;
}

栈实现的整个代码

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

typedef int STDataType;
typedef struct Stack
{
	//存数据
	STDataType* a;
	//设置栈顶
	int top;
	//容量
	int capacity;
}ST;

//初始化
void STInit(ST* ps);
//销毁栈 
void STDestory(ST* ps);
//压数据
void STPush(ST* ps,STDataType x);
//出数据
void STPop(ST* ps);
//获取栈顶元素
STDataType STTop(ST* ps);
//判空
bool STEmpty(ST* ps);
//获取元素个数
int STSize(ST* ps);

//Stack.c
#include "Stack.h"

//初始化
void STInit(ST* ps)
{
	ps->a = NULL;
	ps->capacity = 0;
	//刚开始是栈顶是0
	ps->top = 0;
}
//销毁栈 
void STDestory(ST* ps)
{
	free(ps->a);
	ps->a = NULL;
	ps->capacity = ps->top = 0;
}

//压数据
void STPush(ST* ps, STDataType x)
{
	if (ps->capacity == ps->top)
	{
		//扩容
		int newcapacity = ps->capacity == 0 ? 4 : 2 * (ps->capacity);
		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];
}
//判空
bool STEmpty(ST* ps)
{
	return ps->top == 0;
}

//获取元素个数
int STSize(ST* ps)
{
	return ps->top;
}


//Test.c
#include "Stack.h"

void STTest()
{
	ST st;
	STInit(&st);
	STPush(&st, 1);
	STPush(&st, 2);
	STPush(&st, 3);
	STPush(&st, 4);
	while (!STEmpty(&st))
	{
		int Top = STTop(&st);
		printf("%d ", Top);
		STPop(&st);
	}
	STDestory(&st);
}
int main()
{
	STTest();
	return 0;
}

三、oj题括号匹配问题解答

1
//解题思路:
//1.先把左括号入栈‘(’,‘[’,‘{’,拿到左括号入栈
//2.拿到右括号‘)’,‘]’,‘}’,拿到右括号,把入栈的左括号出栈,看是否匹配,如果匹配,则继续执行上面操作,如果不匹配,则返回false。
//3.考虑如果左括号和右括号的数量一样多,则入栈,出栈,最后的栈内元素个数为0,栈为空!
//4.左括号比右括号多的问题,遇到左括号入栈,遇到右括号出栈,则一定左括号的元素没有出完,检测栈是否为空,不为空,返回false
//5.右括号比左括号多的问题,在拿到右括号出栈之前检测栈是否为空,如果为空,则右括号多,返回false!

//代码实现!

typedef char STDataType;
typedef struct Stack
{
	//存数据
	STDataType* a;
	//设置栈顶
	int top;
	//容量
	int capacity;
}ST;


//初始化
void STInit(ST* ps)
{
	ps->a = NULL;
	ps->capacity = 0;
	//刚开始是栈顶是0
	ps->top = 0;
}
//销毁栈 
void STDestory(ST* ps)
{
	free(ps->a);
	ps->a = NULL;
	ps->capacity = ps->top = 0;
}

//压数据
void STPush(ST* ps, STDataType x)
{
	if (ps->capacity == ps->top)
	{
		//扩容
		int newcapacity = ps->capacity == 0 ? 4 : 2 * (ps->capacity);
		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++;
}
//判空
bool STEmpty(ST* ps)
{
	return ps->top == 0;
}
//出数据
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);
	assert(!STEmpty(ps));
	return ps->top;
}


bool isValid(char* s) {
    ST st;
    STInit(&st);
    while(*s)
    {
        //左括号入栈
        if(
           (*s == '(')||
           (*s == '{')||
           (*s == '[')
          )
        {
            STPush(&st,*s);
        }
        //右括号出栈
        else{
            //右括号多的问题
            if(STEmpty(&st))
            {
                STDestory(&st);
                return false;
            }
            char* Top = STTop(&st);
            STPop(&st);
            if(
                ((Top == '(')&&(*s != ')'))||
                ((Top == '{')&&(*s != '}'))||
                ((Top == '[')&&(*s != ']'))
              )
            {
                return false;
            }
        }
        s++;
    }
    //看是不是左括号多
    bool ret = STEmpty(&st);
    STDestory(&st);
    return ret;
}

完结!!!

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

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

相关文章

ubuntu22.04@Jetson Orin Nano之OpenCV安装

ubuntu22.04Jetson Orin Nano之OpenCV安装 1. 源由2. 分析3. 证实3.1 jtop安装3.2 jtop指令3.3 GPU支持情况 4. 安装OpenCV4.1 修改内容4.2 Python2环境【不需要】4.3 ubuntu22.04环境4.4 国内/本地环境问题4.5 cudnn版本问题 5. 总结6. 参考资料 1. 源由 昨天用Jetson跑demo程…

数据恢复软件推荐!简单几步找回丢失数据!

“我真的非常需要一款靠谱的数据恢复软件&#xff01;在对电脑文件进行移动时有些文件被我误删了&#xff0c;在回收站也无法找到&#xff0c;大家有什么比较好的数据恢复软件推荐吗&#xff1f;” 随着数字时代的来临&#xff0c;数据已成为我们生活和工作中不可或缺的一部分。…

微服务-Alibaba微服务nacos实战

1. Nacos配置中心 1.1 微服务为什么需要配置中心 在微服务架构中&#xff0c;当系统从一个单体应用&#xff0c;被拆分成分布式系统上一个个服务节点后&#xff0c;配置文件也必须跟着迁移&#xff08;分割&#xff09;&#xff0c;这样配置就分散了&#xff0c;不仅如此&…

普中51单片机学习(串口通信)

串口通信 原理 计算机通信是将计算机技术和通信技术的相结合&#xff0c;完成计算机与外部设备或计算机与计算机之间的信息交换 。可以分为两大类&#xff1a;并行通信与串行通信。并行通信通常是将数据字节的各位用多条数据线同时进行传送 。控制简单、传输速度快&#xff1…

自然语言编程系列(二):自然语言处理(NLP)、编程语言处理(PPL)和GitHub Copilot X

编程语言处理的核心是计算机如何理解和执行预定义的人工语言&#xff08;编程语言&#xff09;&#xff0c;而自然语言处理则是研究如何使计算机理解并生成非正式、多样化的自然语言。GPT-4.0作为自然语言处理技术的最新迭代&#xff0c;其编程语言处理能力相较于前代模型有了显…

MT5016A-ASEMI大电流整流桥MT5016A

编辑&#xff1a;ll MT5016A-ASEMI大电流整流桥MT5016A 型号&#xff1a;MT5016A 品牌&#xff1a;ASEMI 封装&#xff1a;D-63 最大重复峰值反向电压&#xff1a;1600V 最大正向平均整流电流(Vdss)&#xff1a;50A 功率(Pd)&#xff1a; 芯片个数&#xff1a;4 引脚数…

Python + Selenium —— 元素定位函数 find_element!

WebDriver 中的 find_element() 方法用来查找元素&#xff0c;并返回 WebElement 对象。是 WebDriver 中最常用的方法。 前面提到的八种定位方式都有对应的方法&#xff0c;如find_element_by_id()。 在 WebDriver 中还有一种用法&#xff0c;就是单纯的find_element()。需要…

8款白嫖党必备的ai写作神器,你都知道吗? #AI写作#科技

这些工具不仅可以快速生成高质量的文本内容&#xff0c;还可以根据用户的需求进行个性化定制。它们可以帮助我们节省大量的时间和精力&#xff0c;让我们更加专注于创意和细节的打磨。本文将为大家详细介绍几个AI写作工具&#xff0c;让你在写作领域更上一层楼。 1.元芳写作 …

ASP.NET-实现图形验证码

ASP.NET 实现图形验证码能够增强网站安全性&#xff0c;防止机器人攻击。通过生成随机验证码并将其绘制成图像&#xff0c;用户在输入验证码时增加了人机交互的难度。本文介绍了如何使用 C# 和 ASP.NET 创建一个简单而有效的图形验证码系统&#xff0c;包括生成随机验证码、绘制…

8*4点LED数显/数码管显示驱动控制芯片-VK1650,兼容替代市面1650,提供FAE技术支持

产品品牌&#xff1a;永嘉微电/VINKA 产品型号&#xff1a;VK1650 封装形式&#xff1a;SOP16 概述&#xff1a; VK1650是一种带键盘扫描电路接口的LED驱动控制专用芯片&#xff0c;内部集成有数据锁存 器、LED驱动、键盘扫描等电路。SEG脚接LED阳极&#xff0c;GRID脚接LED阴…

Outlook 中关闭特殊字符显示

故障现象&#xff1a; 不知道什么原因&#xff0c;Outlook发mail时候&#xff0c;突然显示如下的特殊字符&#xff0c;看起来非常不方便&#xff0c;需要关闭; 解决办法&#xff1a; 在Outlook正文里面&#xff0c;输入CtrlShift*&#xff08; 其中*是键盘数字8旁边的那个*&a…

使用Docker部署Docker-Compose-Ui工具并实现公网访问

文章目录 1. 安装Docker2. 检查本地docker环境3. 安装cpolar内网穿透4. 使用固定二级子域名地址远程访问 Docker Compose UI是Docker Compose的web界面。这个项目的目标是在Docker Compose之上提供一个最小的HTTP API&#xff0c;同时保持与Docker Compose CLI的完全互操作性。…

【Unity3D】ASE制作天空盒

找到官方shader并分析 下载对应资源包找到\DefaultResourcesExtra\Skybox-Cubed.shader找到\CGIncludes\UnityCG.cginc观察变量, 观察tag, 观察代码 需要注意的内容 ASE要处理的内容 核心修改 添加一个Custom Expression节点 code内容为: return DecodeHDR(In0, In1);outp…

第十四章[面向对象]:14.3:实例属性

一,认识实例属性 1,什么是实例属性? 实例属性是与类的每个实例相关联的属性。 每个类的实例都可以拥有自己的一组实例属性。 实例属性通常在类的构造方法(通常是__init__方法)内定义,并使用self关键字来访问。 2,实例属性的一个重要特点是每个实例都有自己独立的一组实…

从0到1的私域流量体系搭建,私域操盘手的底层认知升级

一、教程描述 本套私域操盘手教程&#xff0c;大小4.31G&#xff0c;共有12个文件。 二、教程目录 01第一课、私域能力必修&#xff1a;私域大神熟记于心的高阶私域体系.mp4 02第二课、私域IP打造&#xff1a;那些忍不住靠近的私域IP如何打造的.mp4 03第三课、朋友圈经济&…

openEuler二进制安装MySQL8.0.x

一、环境准备 1、系统&#xff1a;openEuler操作系统 2、MySQL版本&#xff1a;MySQL-8.0.36 3、下载地址&#xff1a;https://dev.mysql.com/get/Downloads/MySQL-8.0 二、安装步骤 1、下载glibc版本的MySQL 2、新建用户以安全方式运行进程 [rootnode4 ~]# groupadd -r -g…

基于STL的演讲比赛流程管理系统(个人学习笔记黑马学习)

1、演讲比赛程序需求 1.1比赛规则 学校举行一场演讲比赛&#xff0c;共有12个人参加。比赛共两轮&#xff0c;第一轮为淘汰赛&#xff0c;第二轮为决赛。每名选手都有对应的编号&#xff0c;如 10001~10012比赛方式:分组比赛&#xff0c;每组6个人;第一轮分为两个小组&#xff…

微服务—RabbitMQ高级(业务在各方面的可靠性)

本博客为个人学习笔记&#xff0c;学习网站&#xff1a;2023黑马程序员RabbitMQ入门到实战教程 高级篇章节 目录 生产者可靠性 生产者重连机制 生产者确认机制 介绍 实现 总结与建议 MQ可靠性 数据持久化 LazyQueue 消费者可靠性 消费者确认机制 失败重试机制 失…

【图与网络数学模型】3.Ford-Fulkerson算法求解网络最大流问题

【图与网络数学模型】3.Ford-Fulkerson算法求解网络最大流问题 一、网络流模型1. 概述2. 可行流3. 增广链 二、示例1. 最大流问题2. Alternate Formulation&#xff1a;最小截量问题 三、Ford-Fulkerson 算法1. 导入库2. 初始化残差图3. 定义查找增广路径4. 定义循环5. 程序运行…

JAVA编程思想-第 4 章 初始化和清除

第 4 章 初始化和清除 “随着计算机的进步&#xff0c;‘不安全’的程序设计已成为造成编程代价高昂的罪魁祸首之一。” “初始化”和“清除”是这些安全问题的其中两个。许多 C 程序的错误都是由于程序员忘记初始化一个变量 造成的。对于现成的库&#xff0c;若用户不知道如何…