赞
踩
如果想要使用C语言来解决这道题——有效的括号:https://leetcode.cn/problems/valid-parentheses/description/我们必须要借用上一篇我们所讲的内容——栈的实现:https://blog.csdn.net/yiqingaa/article/details/138923750?spm=1001.2014.3001.5502
因为在C语言环境下,力扣不会主动帮你实现栈,需要用户自己手动创建栈。但是在C++环境下,力扣会主动为我们实现栈。
这道题为我们用户提供了一个字符串s。我们需要编写程序来判断所给字符串s中,相同类型的左括号与右括号是否一 一匹配。如果匹配正确就返回true。匹配不正确就返回false。
这道题我们可以运用栈的知识面来求出这道题。
我们可以先创建一个栈变量st,然后让字符串s逐一遍历字符,如果遍历过程中字符是‘(’ ‘[’ ‘{’ 都可以将它们尾插到我们栈当中。如果在遍历过程中不是‘(’ ‘[’ ‘{’ ,而是‘)’ ‘]’ ‘}’我们可以调用之前写好的函数功能——取出栈顶元素( STDataType STTop(ST* ps) 这里的SLDataType是我们栈数据类型,可能是int、char或者其他类型。),调出可能之前存入栈的字符‘(’ ‘[’ ‘{’ ,并与遍历字符作对比。这里我暂且将取出栈顶的元素用变量top接受。我们就有取出栈顶元素,与现在遍历字符的关系:
if ((top == '(' && *s != ')') ||
(top == '{' && *s != '}') ||
(top == '[' && *s != ']'))
满足上面其中一个条件我们就可以说明,相同类型的左括号与右括号没有一 一匹配。我们直接返回false即可。
值得注意的是:在返回true,或者false之前,都要对栈进行销毁处理——void STDestroy(ST* ps)
- typedef int STDataType;
- struct Stack
- {
- STDataType* a;
- int top;
- int capacity;
- };
- typedef struct Stack ST;
- void STInit(ST* ps);//栈的初始化
- void STDestroy(ST* ps);//栈的销毁
-
- void STPush(ST*PS,STDataType x);//入栈
- void STPop(ST* ps);//出栈
-
- STDataType STTop(ST* ps);//取栈顶的数据
-
- bool STEmpty(ST*ps);//判空
-
- int STSize(ST* PS);//获取数据个数
- void STInit(ST *ps)//栈的初始化
- {
- assert(ps);
- ps->a = NULL;
- ps->capacity = ps->top = 0;
- }
- void STDestroy(ST* ps)//栈的销毁
- {
- assert(ps);
- free(ps->a);
- ps->a = NULL;
- ps->top = ps->capacity = 0;
- }
- void STPush(ST* ps, STDataType x)//入栈
- {
- assert(ps);
- if (ps->capacity == ps->top)
- {
- int newcapacity = ps->capacity == 0 ? 10 : ps->capacity*2;
- STDataType* tmp = (STDataType*)realloc(ps->a, newcapacity * sizeof(STDataType));
- if (tmp == NULL)
- {
- perror("realloc fail!");
- return;
- }
- ps->a = tmp;
- ps->capacity = newcapacity;
- }
- ps->a[ps->top] = x;
- ps->top++;
- }
- void STPop(ST* ps)//删除栈顶元素
- {
- assert(ps);
- assert(ps->a);
- ps->top--;
- }
- STDataType STTop(ST* ps)//取出栈顶元素
- {
- assert(ps);
- assert(ps->top >= 0);
- return ps->a[ps->top-1];
- }
- bool STEmpty(ST* ps)//判断栈内元素是否为空
- {
- assert(ps);
- if (ps->top == 0)
- return true;
- return false;
- }
- int STSize(ST* ps)//获取数据个数
- {
- assert(ps);
- return ps->top ;
- }
- bool isValid(char* s)
- {
- ST st;
- STInit(&st);
- while (*s)
- {
- if (*s == '(' || *s == '{' || *s == '[')
- {
- STPush(&st, *s);
- }
- else
- {
- if(STEmpty(&st))//这一步是必须的,因为如果栈为空且*s是')' ']' '}',说明
- //题目给出的字符可能是这样的“)”、“(){}]”。类似这种情况都是不符合题意的情况。
- return false;
- char top = STTop(&st);
- STPop(&st);//这里一定要进行尾部栈顶元素删除,以便遍历字符和栈内字符能够对的上
- if ((top == '(' && *s != ')') ||
- (top == '{' && *s != '}') ||
- (top == '[' && *s != ']'))
- {
- return false;
- }
- }
- ++s;
- }
- if (st.top != 0)
- return false;
- STDestroy(&st);
- return true;
- }
今天的题目分享就到此结束了,觉得对你有所帮助的同学,能不能求一个三连。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。