有效的括号题解

首先给出思路:

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;
}
相关推荐
森焱森1 小时前
无人机三轴稳定化控制(1)____飞机的稳定控制逻辑
c语言·单片机·算法·无人机
循环过三天1 小时前
3-1 PID算法改进(积分部分)
笔记·stm32·单片机·学习·算法·pid
呆瑜nuage1 小时前
数据结构——堆
数据结构
蓝澈11211 小时前
弗洛伊德(Floyd)算法-各个顶点之间的最短路径问题
java·数据结构·动态规划
zl_dfq1 小时前
数据结构 之 【堆】(堆的概念及结构、大根堆的实现、向上调整法、向下调整法)(C语言实现)
数据结构
127_127_1271 小时前
2025 FJCPC 复建 VP
数据结构·图论·模拟·ad-hoc·分治·转化
闪电麦坤951 小时前
数据结构:二维数组(2D Arrays)
数据结构·算法
凌肖战2 小时前
力扣网C语言编程题:快慢指针来解决 “寻找重复数”
c语言·算法·leetcode
埃菲尔铁塔_CV算法2 小时前
基于 TOF 图像高频信息恢复 RGB 图像的原理、应用与实现
人工智能·深度学习·数码相机·算法·目标检测·计算机视觉
NAGNIP3 小时前
一文搞懂FlashAttention怎么提升速度的?
人工智能·算法