有效的括号题解

首先给出思路:

1.这道题要调用栈,详情可以看:https://blog.csdn.net/xpcxpt/article/details/148481903?spm=1001.2014.3001.5501

2.我们利用栈后进先出的特点,遇到左括号就入栈,遇到右括号就取栈顶的括号尝试匹配

在遇到左括号的时候,有可能是 ( , [ , { 中的任意一种,所以说我们都要写到,遇到其中之一,就直接入栈:

那如果遇到的是右括号,就用我们的思路:遇到右括号就取栈顶的括号尝试匹配。这里有多种情况

第一种:给的字符串为空,那么我们可以调用判空函数,如果是空,直接返回false

第二种:有额外的括号游离于匹配的括号之外,那我们也可以调用判空函数,如果不为空,代表有游离的括号,也返回false

第三种:恰好数量匹配,那我们就一个一个看是否匹配,如果匹配,就走到字符串下一个字符继续看,直到遍历完字符串

具体代码如下:

cpp 复制代码
typedef char stacktype;
typedef struct Stack
{
	stacktype* a;//动态数组
	int top;    //个数
	int capacity;//空间
}ST;

void STInit(ST* pst);//初始化
void STDestroy(ST* pst);//销毁
void STPush(ST* pst, stacktype x);//插入 入栈
void STPop(ST* pst);//删除 出栈
stacktype STTop(ST* pst);//获取栈顶数据
bool STEmpty(ST* pst);//判断栈是否为空
int STSize(ST* pst);//判断栈的数据个数

void STInit(ST* pst)//初始化
{
	assert(pst);
	pst->a = NULL;
	pst->top = 0;//基于size指向的是栈顶数据的下一个位置
	pst->capacity = 0;
}

void STDestroy(ST* pst)//销毁
{
	assert(pst);
	free(pst->a);//free掉
	pst->a = NULL;//置为空,防止变成野指针
	pst->top = 0;
	pst->capacity = 0;
}

void STPush(ST* pst, stacktype x)//插入 入栈
{
	assert(pst);
	//扩容
	if (pst->top == pst->capacity)
	{
		int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
		stacktype* tmp = (stacktype*)realloc(pst->a, newcapacity * sizeof(stacktype));
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		pst->a = tmp;
		pst->capacity = newcapacity;
	}
	pst->a[pst->top] = x;
	pst->top++;
}
void STPop(ST* pst)//删除 出栈
{
	assert(pst);
	assert(pst->top > 0);//top是非负数
	pst->top--;//删除一个
}
stacktype STTop(ST* pst)//获取栈顶数据
{
	assert(pst);
	assert(pst->top > 0);
	return pst->a[pst->top - 1];
}
bool STEmpty(ST* pst)//判断栈是否为空
{
	assert(pst);
	return pst->top == 0;
}
int STSize(ST* pst)//判断栈的数据个数
{
	assert(pst);
	return pst->top;//从0开始的,所以返回size的大小-1,也就是下表从0-top-1,一共top个
}

bool isValid(char* s) {
    ST st;//创建一个栈
    STInit(&st);//初始化栈
    while(*s)
    {
       //遇到左括号入栈
       if((*s=='(')||(*s=='[')||(*s=='{'))//遇到三种左括号的其中一种
       {
        STPush(&st,*s);//直接入栈
       }
       else//遇到右括号就取栈顶的括号尝试匹配
       {
        if(STEmpty(&st))
        {
            return false;
        }
        char top=STTop(&st);//取出栈顶元素,也就是其中一个左括号
        STPop(&st);//删除栈顶元素,这样子如果这次匹配,下次就从下一个左括号开始匹配
        //如果不匹配
        if((top=='(' && *s !=')')
        ||(top=='[' && *s !=']')
        ||(top=='{' && *s !='}'))
        {
            return false;
        }
       }
       ++s;//取下一个字符
    }
    bool ret = STEmpty(&st);
    STDestroy(&st);//销毁栈
    return ret;
}
相关推荐
小超人诞生日记44 分钟前
C++ 智能指针的使用及其原理详解
c++·算法
lisw052 小时前
互联网上的数据结构可视化!
数据结构·信息可视化
AiNightVision4 小时前
无人机夜视模块如何选择?——从参数指标到系统集成的完整选型指南
人工智能·算法·计算机视觉·车载系统·无人机·视频·智能硬件
牧羊人.3335 小时前
卷积神经网络之VGG
人工智能·深度学习·神经网络·算法·cnn
小郎君6585 小时前
Vue 多标签页的加载态设计:为什么我没有用 Suspense 实现 PageLoading
vue.js·算法
JJJennie7776 小时前
MAI Gateway私有化部署全攻略:大模型网关如何接入?附架构图
算法·gateway·ai网关·魔芋ai
東隅已逝,桑榆非晚6 小时前
算法3.双指针法-快乐数
c++·笔记·学习·算法
专注仿真6 小时前
卷积神经网络(CNN)算法详解
人工智能·python·算法·代码·大模型训练
FII工业富联科技服务6 小时前
多智能体如何进入制造现场?从业务协同到数字孪生验证
大数据·人工智能·算法·机器人·制造·数字孪生