【数据结构算法经典题目刨析(c语言)】括号匹配问题(图文详解)

💓 博客主页:C-SDN花园GGbond

⏩ 文章专栏:数据结构经典题目刨析(c语言)

目录

一、题目描述

二、解题思路

三、代码实现


一、题目描述

二、解题思路

问题要求将三种类型括号匹配,其中包括顺序匹配和数量匹配

使用栈的后进先出结构可以很好的解决这个问题:

根据栈独有的特点,具体操作:1、属于左括号,进行入栈处理。2、属于右括号进行出栈处理,然后进行匹配,不匹配就报错。我们既然选择用C语言来实现,就需要我们自己提前实现一个栈结构

先实现栈 :

cpp 复制代码
//栈的初始化
void STInit(ST* pst)
{
	assert(pst);
	pst->a = NULL;
	pst->top = pst->capacity = 0;//top指向栈顶元素的下一个位置

}
void STDestroy(ST* pst)
{
	assert(pst);
	free(pst->a);
	pst->a = NULL;
	pst->top = pst->capacity = 0;

}
void STPush(ST* pst, STDatyType x)
{
	assert(pst);
	if (pst->top == pst->capacity)
	{
		int newcapacity=pst->capacity==0 ? 4 : pst->capacity * 2;
		STDatyType* tmp =(STDatyType*)realloc(pst->a, newcapacity * sizeof(STDatyType));
		if (tmp == NULL)
		{
			perror("ralloc fail");
			return;
		}
		pst->capacity = newcapacity;
		pst->a = tmp;
	}
	pst->a[pst->top] = x;
	pst->top++;
}
//出栈
void STPop(ST* pst)
{
	assert(pst);
	assert(pst->top > 0);
	pst->top--;
}
//得到栈顶元素
STDatyType 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;
}

遍历字符串
遇到左括号则压栈等待右括号匹配;
遇到右括号先进行判断,首先判断栈是否为空,如果为空则不可能完成匹配,直接判定无效

上述判定不成立再进行下列判断
如果此时栈顶的数据是与右括号匹配的左括号,则出栈,否则直接判定无效(顺序不匹配)
当字符串遍历完成时,如果栈为空,则说明括号全部匹配上了;否则说明数量不匹配

画图举例说明:

第一种情况:数量顺序完全匹配时

第二种情况:数量匹配,顺序不匹配时

第三种情况:数量不匹配时

三、代码实现

cpp 复制代码
typedef char STDatyType;
typedef struct Stack
{
	STDatyType* a;
	int top;
	int capacity;

}ST;
//栈的初始化
void STInit(ST* pst)
{
	assert(pst);
	pst->a = NULL;
	pst->top = pst->capacity = 0;//top指向栈顶元素的下一个位置

}
void STDestroy(ST* pst)
{
	assert(pst);
	free(pst->a);
	pst->a = NULL;
	pst->top = pst->capacity = 0;

}
void STPush(ST* pst, STDatyType x)
{
	assert(pst);
	if (pst->top == pst->capacity)
	{
		int newcapacity=pst->capacity==0 ? 4 : pst->capacity * 2;
		STDatyType* tmp =(STDatyType*)realloc(pst->a, newcapacity * sizeof(STDatyType));
		if (tmp == NULL)
		{
			perror("ralloc fail");
			return;
		}
		pst->capacity = newcapacity;
		pst->a = tmp;
	}
	pst->a[pst->top] = x;
	pst->top++;
}
//出栈
void STPop(ST* pst)
{
	assert(pst);
	assert(pst->top > 0);
	pst->top--;
}
//得到栈顶元素
STDatyType 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;
}


bool isValid(char* s) 
{
    ST st;
    STInit(&st);
    while(*s)
    {
        if(*s=='('||*s=='['||*s=='{')
        {
            STPush(&st,*s);

        }
        else//为右括号
        {
            if(STEmpty(&st))
            {
                STDestroy(&st);
                return false;
            }
            //栈不为空
            STDatyType top=STTop(&st);
            if(*s==')'&&top!='('
            ||*s==']'&&top!='['
            ||*s=='}'&&top!='{')
            {
                STDestroy(&st);
                return false;
            }
            //匹配然后出栈
            STPop(&st);

        }
        s++;

    }
    if(STEmpty(&st))
    {
        STDestroy(&st);
        return true;
    }
    else{
        STDestroy(&st);
        return false;
    }
}
相关推荐
Jeff-Nolan19 小时前
数据结构(c++版):邻接表的实现
数据结构·链表
千弥霜19 小时前
codeforces1914 C~F
c语言·算法
wyiyiyi20 小时前
【数据结构+算法】进栈顺序推算、卡特兰数与逆波兰表达式
汇编·数据结构·笔记·算法
guguhaohao20 小时前
map和set,咕咕咕!
数据结构·c++
LateFrames20 小时前
C# 中,0.1 在什么情况下不等于 0.1 ?
开发语言·c#
froginwe1120 小时前
SciPy 图结构
开发语言
white-persist20 小时前
汇编代码详细解释:汇编语言如何转化为对应的C语言,怎么转化为对应的C代码?
java·c语言·前端·网络·汇编·安全·网络安全
Larry_Yanan20 小时前
QML学习笔记(五十二)QML与C++交互:数据转换——时间和日期
开发语言·c++·笔记·qt·学习·ui·交互
TL滕20 小时前
从0开始学算法——第二天(时间、空间复杂度)
数据结构·笔记·学习·算法
歪歪10020 小时前
详细介绍一下“集中同步+分布式入库”方案的具体实现步骤
开发语言·前端·分布式·后端·信息可视化