Leetcode20.有效的括号

本专栏内容为:leetcode刷题专栏,记录了leetcode热门题目以及重难点题目的详细记录

博主csdn个人主页:小小unicorn
⏩专栏分类:Leetcode
代码仓库:小小unicorn的代码仓库
关注我带你学习编程知识

有效的括号

  • 题目描述
  • 解题思路:
  • 代码解决:
  • 结果与总结:

题目描述

题目来源:Leetcode20.有效的括号

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

有效字符串需满足:

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

解题思路:

该题是栈的典型应用,满足后进先出的规则(后入栈的前括号将优先与先出现的后括号相匹配)。
 遍历字符串,遇到前括号直接入栈。遇到后括号,判断该后括号与栈顶的前括号是否匹配(若此时栈为空,则字符串无效),若不匹配则字符串无效;若匹配则删除栈顶元素,继续遍历字符串,直到字符串遍历完毕。当字符串遍历完后,检测栈是否为空,若为空,则字符串有效,若不为空,说明有前括号未匹配,字符串无效。

代码解决:

#define _CRT_SECURE_NO_WARNINGS
#include
#include

//链接:
//https ://leetcode.cn/problems/valid-parentheses/

typedef char STDataType;//栈中存储的元素类型

typedef struct Stack
{
	STDataType* a;//栈
	int top;//栈顶
	int capacity;//容量,方便增容
}Stack;

//初始化栈
void StackInit(Stack* pst)
{
	assert(pst);

	pst->a = (STDataType*)malloc(sizeof(STDataType) * 4);//初始化栈可存储4个元素
	pst->top = 0;//初始时栈中无元素,栈顶为0
	pst->capacity = 4;//容量为4
}

//销毁栈
void StackDestroy(Stack* pst)
{
	assert(pst);

	free(pst->a);//释放栈
	pst->a = NULL;//及时置空
	pst->top = 0;//栈顶置0
	pst->capacity = 0;//容量置0
}

//入栈
void StackPush(Stack* pst, STDataType x)
{
	assert(pst);

	if (pst->top == pst->capacity)//栈已满,需扩容
	{
		STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * pst->capacity * 2);
		if (tmp == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		pst->a = tmp;
		pst->capacity *= 2;//栈容量扩大为原来的两倍
	}
	pst->a[pst->top] = x;//栈顶位置存放元素x
	pst->top++;//栈顶上移
}

//检测栈是否为空
bool StackEmpty(Stack* pst)
{
	assert(pst);

	return pst->top == 0;
}

//出栈
void StackPop(Stack* pst)
{
	assert(pst);
	assert(!StackEmpty(pst));//检测栈是否为空

	pst->top--;//栈顶下移
}

//获取栈顶元素
STDataType StackTop(Stack* pst)
{
	assert(pst);
	assert(!StackEmpty(pst));//检测栈是否为空

	return pst->a[pst->top - 1];//返回栈顶元素
}

//获取栈中有效元素个数
int StackSize(Stack* pst)
{
	assert(pst);

	return pst->top;//top的值便是栈中有效元素的个数
}
/*---以上代码是栈的基本功能实现,以下代码是题解主体部分---*/



bool isValid(char* s)
{
	Stack st;//创建一个栈
	StackInit(&st);//初始化栈

	char* cur = s;
	while (*cur)
	{
		//前括号统一进栈
		if (*cur == '(' || *cur == '[' || *cur == '{')
		{
			StackPush(&st, *cur);
			cur++;
		}
		else
		{
			//若遇到后括号,且栈为空,则字符串无效
			if (StackEmpty(&st))
			{
				StackDestroy(&st);
				return false;
			}
			//获取栈顶元素
			char top = StackTop(&st);
			//后括号与栈顶的前括号不匹配
			if (top == '(' && *cur != ')' || top == '{' && *cur != '}' || top == '[' && *cur != ']')
			{
				StackDestroy(&st);
				return false;
			}
			//匹配
			else
			{
				StackTop(&st);
				cur++;
			}
		}
	}
	//检测栈是否为空
	bool ret = StackEmpty(&st);
	StackDestroy(&st);
	//返回结果
	return ret;
}

结果与总结:

Leetcode20.有效的括号_第1张图片

通过所有示例,问题得到解决。

你可能感兴趣的:(leetcode,数据结构)