C语言题目练习5——有效的括号

在前面我们已经学习了一些基本的数据结构以及进行一些算法题练习,领会到了一些算法题巧妙的算法思路~这一篇博客依然是关于算法题的练习~继续在算法的世界里面遨游~

有效的括号

有效的括号: https://leetcode.cn/problems/valid-parentheses/description/


这里的括号需要左边的括号与右边的括号进行匹配,( 与 )匹配,[ 与 ]匹配,{ 与 }匹配,这个题如果我们使用常规的方法并不好解决~这里就需要用到我们的数据结构知识来解决这个问题啦~

思路

将字符串遍历,如果是当前字符是左括号就入栈,如果当前字符是右括号就将它与取到的栈顶元素进行匹配,如果不匹配就return false,然后再出栈(删除当前元素),在出栈前需要判断栈是否为空,如果为空说明栈目前没有左括号,显然这是不匹配的(左括号应该在左边,右括号在右边)return false,遍历字符串结束,这里需要判断栈是否为空,避免有左括号没有匹配的情况,为空返回true,不为空返回false。

注意

可能有一些难理解,我们一步步来看~

首先将栈的一些基本实现拿过来用

cpp 复制代码
//栈的基本实现
typedef char StackDatatype;
//这个题目中栈保存的数据是字符
typedef struct Stack
{
	StackDatatype* arr;
	int top;
	int capacity;
}Stack;
//初始化
void StackInit(Stack* ps)
{
	assert(ps);

	ps->arr = NULL;
	ps->top = ps->capacity = 0;
}
//入栈
void StackPush(Stack* ps, StackDatatype x)
{
	assert(ps);
	//判断容量是否足够
	if (ps->top == ps->capacity)//空间已满
	{
		int newcapacity = (ps->capacity == 0) ? 4 : 2 * (ps->capacity);
		StackDatatype* temp = realloc(ps->arr, sizeof(StackDatatype) * newcapacity);
		if (temp == NULL)
		{
			perror("realloc fail");
			exit(1);
		}
		else
		{
			ps->arr = temp;
			ps->capacity = newcapacity;
		}
	}
	//空间足够
	ps->arr[ps->top++] = x;
}

//判断栈是否为空
bool StackEmpty(Stack* ps)
{
	assert(ps);
	return ps->top == 0;
	//栈没有元素
}
//取栈顶元素
StackDatatype StackTop(Stack* ps)
{
	assert(ps);
	//栈不能为空
	assert(!StackEmpty(ps));

	return ps->arr[ps->top - 1];
}


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

//获取栈有效个数
int StackCount(Stack* ps)
{
	assert(ps);
	return ps->top;
}

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

实现函数代码及详细解释:

cpp 复制代码
bool isValid(char* s)
{
    assert(s);//字符串地址有效
    Stack st;
    StackInit(&st);//初始化栈
    char* pcur = s;
    //遍历字符串左括号入栈
    while ((*pcur) != '\0')
    {
        if ((*pcur) == '(' || (*pcur) == '[' || (*pcur) == '{')
        {
            //入栈
            StackPush(&st, (*pcur));
        }
        //!!!每一次返回true或者false前要进行栈销毁
        else//遇到右括号取栈顶元素比较是否匹配
        {
            if (StackEmpty(&st))
                //栈为空,目前只有右括号,前面没有左括号匹配
            {
                StackDestory(&st);
                return false;
            }
            //取栈顶元素比较
            StackDatatype re = StackTop(&st);
            //当前字符与栈顶元素不匹配
            if ((re == '(' && *pcur != ')') ||
                (re == '[' && *pcur != ']') ||
                (re == '{' && *pcur != '}'))
            {
                StackDestory(&st);
                return false;
            }
            //满足当前数据出栈
            StackPop(&st);
        }
        pcur++;//继续往后面遍历
    }
    //判断栈是否为空
    //栈不为空,还有左边括号没有匹配
    /*if(StackEmpty(&st))
    {
        StackDestory(&st);
        return true;
    }
    else
    {
        StackDestory(&st);
        return false;
    }*/
    //优化
    bool ret = StackEmpty(&st) ? true : false;
    //使用bool类型保存返回值
    StackDestory(&st);
    return ret;
}

结合着代码来看,是不是更加清晰呢?我们也就完成了这一段代码,提交一下看能否通过?

提交通过~感觉知识又以一种奇怪的方式进入了脑子~

今日练习结束,期待与各位未来的优秀程序员交流,有什么问题请私信~~~

相关推荐
图码几秒前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
handler019 分钟前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
minglie115 分钟前
实数列的常用递推模式
算法
我星期八休息31 分钟前
IT疑难杂症诊疗室:AI时代工程师Superpowers进化论
linux·开发语言·数据结构·人工智能·python·散列表
代码小书生34 分钟前
math,一个基础的 Python 库!
人工智能·python·算法
AI科技星36 分钟前
全域数学·数术本源·高维代数卷(72分册)【乖乖数学】
人工智能·算法·数学建模·数据挖掘·量子计算
热心网友俣先生40 分钟前
2026年第二十三届五一数学建模竞赛C题超详细解题思路+各问题可用模型推荐+部分模型结果展示
c语言·开发语言·数学建模
生成论实验室42 分钟前
《事件关系阴阳博弈动力学:识势应势之道》第一篇:生成正在发生——从《即事经》到事件-关系网络
人工智能·科技·算法·架构·创业创新
漂流瓶jz1 小时前
UVA-1152 和为0的4个值 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·二分查找·题解·aoapc·算法竞赛入门经典·uva
leoufung1 小时前
LeetCode 76:Minimum Window Substring 题解与滑动窗口思维详解
算法·leetcode·职场和发展