有效的括号数据结构oj题(力口20)

目录

目录

题目描述

题目分析解析

解决代码

写题感悟:


题目描述

还有实例

题目分析解析

对于这个题目,我们首先有效字符串需要满足什么,第一个左右括号使用相同类型的括号,这好理解,无非就是小括号和小括号大括号和大括号一起匹配。其次第二个就是左括号必须以正确顺序来匹配,注意了是顺序,大家以为就是左括号(小括号)遇到左括号(中括号)然后遇到了右括号(小括号)和右括号(中括号),然而恰恰相反,而是小括号(左)、中括号(右)和中括号(右)小括号(右)相依匹配(大致就是遇到第一个右括号时,然后与自己最近的左括号进行匹配,假设匹配成功消除,第二个右括号继续匹配最近的括号)。最后就是第三个和我们将的第一个差不多,就是和对应的左括号匹配,但是这里主要是限制只有右括号的情况

接下来就是如何解决问题了。

这里我们根据第二个要求,可以知道当遇到右括号时,需要找到与之最近的左括号匹配,通过这个我们就能想到,当遇到右括号时把后进的左括号与之对比看是否满足相同类型括号。这个后进先出就和我们学过的数据结构栈有关系,所以我们这里需要数据结构栈来写。将遇到的左括号存入栈中,直到遇到右括号(这里还得考虑是否右括号),判断是否匹配成功,只要有一个匹配失败,就说明这个字符串不符合有效字符,以上都符合后,最后判断栈是否还有左括号,如果没有则符号题目要求。

解决代码

cpp 复制代码
//栈结构
typedef char STDataType;
typedef struct Stack
{
	STDataType* arr;
	int top;
	int capacity;
}ST;
//初始化
void StackInit(ST* Stack)
{
	Stack->arr = NULL;
	Stack->capacity = Stack->top = 0;
}

//入栈
void StackPush(ST* Stack, STDataType x)
{
	assert(Stack);
	//空间不够
	if (Stack->capacity == Stack->top)
	{
		//扩容
		int newcapacity = Stack->capacity == 0 ? 4 : 2 * Stack->capacity;
		STDataType* tmp = (STDataType*)realloc(Stack->arr, newcapacity * sizeof(STDataType));
		if (tmp == NULL)
		{
			perror("realloc");
			exit(1);
		}
		Stack->arr = tmp;
		Stack->capacity = newcapacity;
	}
	//空间够
	Stack->arr[Stack->top++] = x;
}

//判断
bool StackEmpty(ST* Stack)
{
	assert(Stack);
	return Stack->arr==NULL;
}

//出栈
void StackPop(ST* Stack)
{
	assert(!StackEmpty(Stack));
	--Stack->top;
}

//获取栈中元素
STDataType StackTop(ST* Stack)
{
	assert(!StackEmpty(Stack));
	return Stack->arr[Stack->top - 1];
}

//获取栈中元素个数
int StackSize(ST* Stack)
{
	assert(!StackEmpty(Stack));
	return Stack->top;
}

//销毁栈
void StackDestory(ST* Stack)
{
	if (Stack->arr)
		free(Stack->arr);
	Stack->arr = NULL;
	Stack->capacity = Stack->top = 0;
}

bool isValid(char* s) {
    ST st;
StackInit(&st);
char* cur = s;
while (*cur != '\0')
{
    //遇到左括号存入栈
    if (*cur == '('
        || *cur == '['
        || *cur == '{')
    {
        StackPush(&st, *cur);
    }
    //遇到右括号取栈顶元素进行对比
    else
    {
        //内部栈为空时(只有右括号时)
        if(st.top == 0)
        {
            return false; 
        }

             char top = StackTop(&st);
        if (*cur == ')' && top != '('
            || *cur == ']' && top != '['
            || *cur == '}' && top != '{')
        {
            StackDestory(&st);
            return false;
        }
        StackPop(&st);
        
       
    }
   
    cur++;
}
if (!StackSize(&st))
{
    return true;
}
else
{
    return false;
}
}

写题感悟

这道题对于初学者的我很难想到尽然会用到数据结构栈,这说明数据结构在刷题过程中发挥着不可磨灭的作用。因此我觉得思路和知识都很重要,当然知识是的重要占大头,没有知识就没有这个思路,就算给你一个思路,也很难实现。我觉得在前期的刷题过程需要刻意取练习,到后面就需要综合去刷,利用自己学到的知识去解决问题,这个题目告诉我如果遇到先进后出或者后进需要先出类似的题目,首先可以考虑栈。