括号匹配问题@Leetcode —— 栈和队列

括号匹配问题

  • 1. 题目
  • 2. 思路
  • 3. 题解

在这里插入图片描述

1. 题目

题目链接:括号匹配问题
括号匹配问题@Leetcode —— 栈和队列_第1张图片

2. 思路

用C语言实现,我们需要借助这个数据结构,这是C语言比较麻烦之处,我们直接把写好的基本接口直接贴过来。前置文章:栈@栈和队列

根据测试用例,借助栈先进后出的特点
遇到左括号 —— 入栈
遇到右括号 —— 弹栈,与该右括号匹配

分析到这里,大致逻辑就写得出来。另外还有两类用例来可能没有一下子想到,没关系,没过补充完善一下就好嘞~

1.如果最后栈不为空,说明当中还有未匹配的左括号。返回false

"["  用例1

2.如果遇到右括号,但是栈为空,说明没有与之匹配的左括号。返回false(足够严谨可以想得到,毕竟要出栈,栈不能为空,为空要提前处理掉,否则会触发断言)

"]"  用例2

注意:所有可能返回地方,返回之前都要把栈销毁,否则内存泄漏

去掉无聊的函数接口的主体代码附在这 ——

bool isValid(char * s){
    ST st;
    StackInit(&st);
    while(*s)
    {
        if(*s == '(' || *s == '['|| *s == '{')
        {
            StackPush(&st,*s);
        }
        else
        {
            if(StackEmpty(&st))
            {
                //遇到右括号,但是栈里面没有数据,
                //说明栈中没有左括号可以与之匹配,返回false
                StackDestroy(&st);
                return false;
            }
            STDataType top = StackTop(&st);
            StackPop(&st);

            if((*s == ')' && top != '(')
            ||(*s == ']' && top != '[')
            ||(*s == '}' && top != '{'))
            {
                //合在一起写
                StackDestroy(&st);
                return false;
            }
        }
        s++;
    }
    //最后栈不为空,说明栈中还有左括号无法被匹配
    if(!StackEmpty(&st))
    {
        StackDestroy(&st);
        return false;
    }
    StackDestroy(&st);
    return true;
}

3. 题解

完整题解在此,去掉无聊的函数接口的主体代码在上一个标题

#define _CRT_SECURE_NO_WARNINGS 1

typedef char STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;//栈顶位置
	int capacity;
}ST;

void StackInit(ST* ps);
void StackDestroy(ST* ps);

//压栈
void StackPush(ST* ps, STDataType x);
//出栈
void StackPop(ST* ps);
//取栈顶数据
STDataType StackTop(ST* ps);
//栈中数据多少?
int StackSize(ST* ps);
//判断栈是否为空
bool StackEmpty(ST* ps);

void StackInit(ST* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->top = 0;
	ps->capacity = 0;
}

void StackDestroy(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;//有必要,不然就是野指针了
	ps->top = 0;
	ps->capacity = 0;
}

void StackPush(ST* ps, STDataType x)
{
	assert(ps);
	if (ps->top == ps->capacity)
	{
		int newcapacity = (ps->capacity == 0) ? 4 : 2 * ps->capacity;
		STDataType* ptr = (STDataType*)realloc(ps->a, newcapacity *sizeof(STDataType));
		if (ptr == NULL)
		{
			printf("realloc failed\n");
			exit(-1);
		}
		ps->a = ptr;
		ps->capacity = newcapacity;
	}
	ps->a[ps->top] = x;
	ps->top++;
}

void StackPop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));//断言,栈不为空--这样调用函数不会受到你实现方式的影响
	ps->top--;
}

int StackSize(ST* ps)
{
	assert(ps);
	return ps->top;
}

bool StackEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}

STDataType StackTop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	return ps->a[ps->top - 1]; // 注意是top - 1
}


bool isValid(char * s){
    ST st;
    StackInit(&st);
    while(*s)
    {
        if(*s == '(' || *s == '['|| *s == '{')
        {
            StackPush(&st,*s);
        }
        else
        {
            if(StackEmpty(&st))
            {
                //遇到右括号,但是栈里面没有数据,
                //说明栈中没有左括号可以与之匹配,返回false
                StackDestroy(&st);
                return false;
            }
            STDataType top = StackTop(&st);
            StackPop(&st);

            if((*s == ')' && top != '(')
            ||(*s == ']' && top != '[')
            ||(*s == '}' && top != '{'))
            {
                //合在一起写
                StackDestroy(&st);
                return false;
            }
        }
        s++;
    }
    //最后栈不为空,说明栈中还有左括号无法被匹配
    if(!StackEmpty(&st))
    {
        StackDestroy(&st);
        return false;
    }
    StackDestroy(&st);
    return true;
}

你可能感兴趣的:(初阶数据结构,数据结构经典题解,leetcode,算法,职场和发展)