首页 > 其他分享 >数据oj题——有效的括号

数据oj题——有效的括号

时间:2025-01-09 18:28:32浏览次数:3  
标签:ps return oj 有效 top ST 括号 StDatatype st

好了,上一篇我们写过栈的实现的文章了,此外,我们现在来利用栈来写一道OJ题

20. 有效的括号 - 力扣(LeetCode)

这道题呢,由于还没有学到c++,我们还是使用c语言的形来写,而c语言有没有栈的库,所以就得我们亲自手搓一个。即我们上一篇写过的栈的实现。

注意的是:

上一篇我们写的栈的实现是使用的是int,而括号是属于char类型的,所以我们得改一下。

这里我们只需要改一下下面那个就行了

typedef char StDatatype;

通过这个,我们可以一下子可以明白了,为什么之前无论是单链表,顺序表等等都要使用这个代替类型了吧。如果改变了类型,我们只需要改一下这里就行,但是,试想如果没有这代码,是不是得改栈里面的很多地方?这就非常的麻烦了,这里就显得非常牛的了。

现在开始写另外的这道题目的正文

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

            char top=STTop(&st);
            STPop(&st);
            if((*s==')' && top !='(')||
            (*s=='}' &&top !='{') ||
            (*s==']' &&top !='['))
            {
                return false;
            }
        }
        s++;

    }
    bool ret=STEmpty(&st);
    Destory(&st);
    return ret;

}

解释:

我们这里分为两个部分:左括号和右括号。

如果是左括号eg:(,{ , [ 的话就先插入,不是的话就出栈。

此时,还要注意top的变化,

出栈时,如果进栈的左括号与出栈的右括号不匹配的话,就可以直接返回判断它错误就行,

匹配的话,就让他继续出栈即s++。

注意的是:这里不要写成

if((*s=='(' && top !=')')||
            (*s=='{' &&top !='}') ||
            (*s=='[' &&top !=']'))
            {
                return false;
            }

*s是右括号, 满足 == 任意一个左括号 (  [ { 
都是不等于的,所以直接是假。
条件为真才会进入if语句呢
别忘了上面是else!!!!!

此外,我们还得还要考虑这么一种情况:

当直到出栈完了为空后,还没找到匹配,也就直接返回判断错误就行了

最后不要忘了还要释放空间。!

现在来附上代码

typedef char StDatatype;
typedef struct Stack
{
	StDatatype* a ;
	int top;
	int capacity;

}ST;

//初始化
void STInit(ST* ps);
void Destory(ST* ps);
void STPush(ST* ps,StDatatype x);
void STPop(ST* ps);
int size(ST* ps);
bool STEmpty(ST* ps);
StDatatype STTop(ST* ps);

void STInit(ST* ps)
{
	assert(ps);
	ps->a = (StDatatype*)malloc(sizeof(StDatatype) * 4);
	if (ps->a == NULL)
	{
		perror("malloc fail");
		return;
	}
	ps->top = 0;
	ps->capacity = 4;
}

void Destory(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = 0;
	ps->top = 0;
}
void  STPush(ST* ps,StDatatype x)
{
	if (ps->top == ps->capacity)
	{
		StDatatype* temp =(StDatatype*) realloc(ps->a, sizeof(StDatatype) * ps->capacity * 2);
		if (temp == NULL)
		{
			perror("realloc fail");
			return ;
		}
		ps->a = temp;
		ps->capacity *= 2;
	}
	ps->a[ps->top] = x;
	ps->top++;
}
void STPop(ST* ps)
{
	assert(ps);
	assert(!STEmpty(ps));
	ps->top--;
}
int size(ST* ps)
{
	assert(ps);
	return ps->top;
}
bool STEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}
StDatatype STTop(ST* ps)
{
	assert(ps);
    assert(!STEmpty(ps));
	return ps->a[ps->top-1];
}

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

            char top=STTop(&st);
            STPop(&st);
            if((*s==')' && top !='(')||
            (*s=='}' &&top !='{') ||
            (*s==']' &&top !='['))
            {
                return false;
            }
        }
        s++;

    }
    bool ret=STEmpty(&st);
    Destory(&st);
    return ret;

}

到了这里,就结束了。

今次鸡汤:

坚持住,勇敢闯出那一步!

标签:ps,return,oj,有效,top,ST,括号,StDatatype,st
From: https://blog.csdn.net/go_bai/article/details/145039272

相关文章

  • [BZOJ3159] 决战 题解
    个人感觉各方面难度高于《在美妙的数学王国中畅游》,也不知道是不是求导的关系,这题\(luogu\)难度评级还更低。不过感觉这题作完对\(LCT\)理解更顺畅了。前四个操作简单,关键在第五人格操作。注意力惊人的注意到我们无法像普通\(Splay\)一样,直接对\(LCT\)中的\(Splay\)......
  • 解决能源行业协作难题的有效工具
    智能电网的普及以及绿色能源的推广正在改变能源行业的工作模式。对能源企业而言,信息流转效率与协作的精准度,决定了项目的成败。而在线文档协作工具的引入,则让许多日常难题迎刃而解。以可再生能源电站的远程监控为例,这一领域需要多个团队在不同地点快速分享和分析数据。例如,当风电......
  • 2024最新Facebook养号攻略!3大步骤有效养成多账号
    在海外社媒Facebook营销之中,我们经常能够听到分享关于“养号”的内容,“养号”是海外营销前必不可少的环节,那么这个养号到底怎么养才有效?有什么作用呢?下面小编汇集全网有效案例,给大家带来几个有用的分享。一、Facebook养号真的有用吗?许多从事Facebook营销的专业人士都清楚,Fac......
  • 最长有效括号(动态规划)
    给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。 示例1:输入:s="(()"输出:2解释:最长有效括号子串是"()"示例2:输入:s=")()())"输出:4解释:最长有效括号子串是"()()"示例3:输入:s=""输出:0 思路:定义dp[i]表示以下标i......
  • tuack 配置文件转 uoj 配置文件
    #!/bin/envpython3fromtuackimportbasefromosimportsystembase.init()name="printer"deflndata(src,dst):system(f"ln-snf{src}.in{dst}.in")system(f"ln-snf{src}.ans{dst}.out")system(f"cpstatement......
  • 242有效的字母异位词 349. 两个数组的交集 202快乐数
    这几道都比较简单,主要是熟悉哈希的操作classSolution{public:boolisAnagram(strings,stringt){intalphab[26]={0};for(inti=0;i<s.size();i++){alphab[s[i]-'a']++;}for(inti=0;i<t......
  • pojo和javabean的区别
    POJO(PlainOldJavaObject)和JavaBean是Java编程中常用的术语,虽然它们有相似之处,但在概念和使用上有一些区别。以下是对它们的详细介绍。POJO(PlainOldJavaObject)定义POJO 是指一个普通的Java对象,没有特定的约束或要求。它不依赖于任何特定的框架或库。特点简单......
  • 深圳大学-程序设计基础-OJ
    A.字母转换(顺序)题目描述输入一个大写字母,输出其对应的小写字母。例如输入E,输出e。输入一个大写字母(A~Z)输出对应的小写字母输入样例B输出样例b代码#include<iostream>#include<algorithm>#include<cmath>#include<vector>#include<set>#include......
  • (2025自测有效!)全网最好的python配置教程【非常非常适合小白】
    前几天我的电脑刚刚重装,把python重新配置了一下。1.Python环境部署Python3可应用于多平台包括Windows、Linux和MacOSX。Python官网:https://www.python.org/进入官网在导航栏选择Dowmloads,选择所使用的系统(以Windows为例)进入Windows下载页之后选择需要下载的版本(根据系统......
  • 文件防泄密措施有哪些?八种方法有效防止文档泄密!文档防泄密
    文件防泄密措施有哪些?八种方法有效防止文档泄密!文档防泄密在信息为王的时代,企业文档作为核心资产,其安全保密至关重要。一旦发生泄密事件,不仅会导致商业机密外流,更可能使企业在激烈的市场竞争中陷入被动。域智盾软件宛如一位忠诚的卫士,为企业文件安全筑起坚固防线,提供了一系......