【leetcode】20.有效的括号

【leetcode】20.有效的括号_第1张图片

【leetcode】20.有效的括号_第2张图片

题目分析:
给定的字符串s可能为空串,空串返回false,不为空串时进行以下操作

遍历字符串,左括号 '(' 、 '[' 、 '{' 压栈,右括号与此时的栈顶元素对比匹配

1️⃣匹配,则栈顶元素出栈,继续遍历字符串

2️⃣不匹配:分为空栈和非空栈两种情况

  • 空栈:则数量不匹配,返回false
  • 非空栈:右括号与栈顶元素不匹配,返回false

以上情况没有返回,即字符串遍历结束没有返回,此时需要判断栈的情况,栈空则所有右括号匹配成功,返回true;栈非空则说明有左括号未匹配成功,返回false

Note:

C语言中没有栈,我们需要自己进行栈及栈的相关操作的定义

以下为参考代码:

#define SDataType char
//定义栈
typedef struct stack
{
    SDataType* a;
    int top;
    int capacity;
}ST;
//初始化
void StackInit(ST* ps)
{
    assert(ps);
    ps->a = NULL;
    ps->top = ps->capacity = 0;
}

//销毁
void StackDestroy(ST* ps)
{
    assert(ps);
    free(ps->a);
    ps->a = NULL;
    ps->top = ps->capacity = 0;
}
//压栈
void StackPush(ST* ps, SDataType x)
{
	assert(ps);
	//扩容
	if (ps->top == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : (ps->capacity) * 2;
		SDataType* tmp = realloc(ps->a, newcapacity * sizeof(SDataType));
		//扩容失败
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(-1);
		}
		//扩容成功
		ps->a = tmp;
		ps->capacity = newcapacity;
	}
	//插入数据
	ps->a[ps->top] = x;
	ps->top++;
}
//判断栈空
bool StackEmpty(ST* ps)
{
    assert(ps);
    return ps->top == 0;
}
//出栈
void StackPop(ST* ps)
{
    assert(ps);
    if(!StackEmpty(ps))
    {
        ps->top--;
    }
}

//访问栈顶元素
SDataType StackTop(ST* ps)
{
    assert(ps);
    if(!StackEmpty(ps))
    {
        return ps->a[ps->top-1];
    }
    return -1;
    
}

bool isValid(char * s){
    ST st;
    StackInit(&st);
    while(*s)
    {
        //左括号压栈
        if(*s == '(' || *s == '[' || *s == '{')
        {
            StackPush(&st, *s);
        }
        //右括号则与栈顶元素比较是否匹配
        else
        {
            //空栈:括号数量不匹配
            if(!StackEmpty)
            {
                StackDestroy(&st);
                return false;
            }
            //非空栈
            char ch = StackTop(&st);
            StackPop(&st);
            if(*s == '}' && ch != '{' 
                || *s == ']' && ch != '[' 
                || *s == ')' && ch != '(')
                {
                    StackDestroy(&st);
                    return false;
                }
        }
        ++s;
    }
    //此时栈不为空,则数量不匹配,即有左括号未匹配;栈为空即所有括号匹配成功
    bool flag = StackEmpty(&st);
    StackDestroy(&st);
    return flag;;

}

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