【每日OJ—有效的括号(栈)】
2023-12-19 00:08:59
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
世上有两种耀眼的光芒,一种是正在升起的太阳,一种是正在努力学习编程的你!一个爱学编程的人。各位看官,我衷心的希望这篇博客能对你们有所帮助,同时也希望各位看官能对我的文章给与点评,希望我们能够携手共同促进进步,在编程的道路上越走越远!
提示:以下是本篇文章正文内容,下面案例可供参考
1、有效的括号题目:
1.1方法讲解:
解题思路:
栈的规则:后入先出。我们这道题用栈来解答。
步骤:1、遍历字符串;
2、让字符串中的左括号’(‘,‘[’,?‘{’入栈;
3、如果遇到右括号’)’ ‘]’ ‘}’就出栈,让栈顶出来的左括号与右括号进行匹配。
在对左、右括号匹配时,可能会出现以下几种情况:
1、右括号比左括号多,数量匹配问题,返回false;
2、左括号比右括号多,数量匹配问题,返回false;
3、全是左括号或者全是右括号,数量匹配问题,返回false。
1.2代码实现:
typedef int STDataType;
typedef struct stack
{
STDataType* a;
int top;//标识栈顶的位置
int capacity;
}ST;
//初始化
void STInit(ST* pst);
//销毁
void STDestory(ST* pst);
//压栈
void STPush(ST* pst, STDataType x);
//出栈
void STPop(ST* pst);
//获取栈顶元素
STDataType STTop(ST* pst);
//判空
bool STEmpty(ST* pst);
//统计栈内元素个数
int STSize(ST* pst);
//初始化
void STInit(ST* pst)
{
assert(pst);
pst->a = NULL;
//表示top指向栈顶元素的下一个位置
pst->top = 0;
//表示top指向栈顶元素
//pst->top = -1;
pst->capacity = 0;
}
//销毁
void STDestory(ST* pst)
{
assert(pst);
free(pst->a);
pst->a = NULL;
pst->capacity = pst->top = 0;
}
//压栈
void STPush(ST* pst, STDataType x)
{
assert(pst);
//判断数组栈空间是否足够
if (pst->top == pst->capacity)
{
int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newcapacity);
if (tmp == NULL)
{
perror("realloc fail");
return;
}
pst->a = tmp;
pst->capacity = newcapacity;
}
pst->a[pst->top] = x;
pst->top++;
}
//出栈
void STPop(ST* pst)
{
assert(pst);
assert(pst->top > 0);
pst->top--;
}
//获取栈顶元素
STDataType STTop(ST* pst)
{
assert(pst);
assert(pst->top > 0);
return pst->a[pst->top - 1];
}
//判空
bool STEmpty(ST* pst)
{
assert(pst);
//判断数组栈为空
//1、如果top是指向栈顶元素的下一个位置,那当top == 0时,栈为空
//2、如果top时指向栈顶元素,那当top == -1时,栈为空
/*if (pst->top == 0)
{
return true;
}
else
{
return false;
}*/
return pst->top == 0;
}
//统计栈内元素个数
int STSize(ST* pst)
{
assert(pst);
//1、如果top指向栈顶元素的话,栈内元素的个数为top+1;
//2、如果top指向栈顶元素的下一个位置的话,栈内元素的个数为top;
return pst->top;
}
bool isValid(char* s) {
//同一个域里面不能有同一个变量
ST st;
STInit(&st);
while(*s)
{
//遍历字符串
//如果是左括号就入栈
if(*s == '[' || *s == '(' || *s == '{')
{
STPush(&st,*s);
s++;
}
else
{
//右括号多,左括号少的数量匹配问题
if(STEmpty(&st))
{
STDestory(&st);
return false;
}
//如果是右括号,就从栈中取出一个左括号来进行匹配
char top = STTop(&st);
STPop(&st);
//顺序不匹配
if((*s == '}' && top != '{')
|| (*s == ']' && top != '[')
|| (*s == ')' && top != '('))
{
STDestory(&st);
return false;
}
s++;
}
}
//栈为空,返回真,说明数量匹配
//匹配问题:左括号多,右括号少
bool ret = STEmpty(&st);
STDestory(&st);
return ret;
}
总结
好了,本篇博客到这里就结束了,如果有更好的观点,请及时留言,我会认真观看并学习。
不积硅步,无以至千里;不积小流,无以成江海。
文章来源:https://blog.csdn.net/2301_79585944/article/details/134981581
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!