【算法入门】Leetcode--20.有效的括号

一.题目的分析

题目如下:
在这里插入图片描述
这题其实是一道关于的经典面试题,我们可以思考如何通过栈来完成这题。首先我们知道栈是后进先出的线性表,我们即可利用这一特性,来比较是否为有效的括号,具体思路如下
我们应当先定义一个栈用来存放括号,当然也应完成栈的基本功能----初始化、出栈、压栈、检查是否为空栈、返回栈顶元素等…
我们完成栈功能的实现后,🍁首先我们创建一个栈的结构体指针并且初始化,🍁接着计算出给定的字符串的长度,如果字符串长度为奇数则不可能满足题目要求,🍁接着将字符串的长度作为接下来循环的次数,🍁在循环体中依次判断每一个字符,如果为左括号则将左括号压入栈,如果为右括号则判断是否与当前栈顶的元素所匹配为有效的括号,如果匹配成功则删除栈顶元素,反之返回false,最后在循环结束后,判断当前是否为空栈,如果为空栈则返回true反之返回false

二.代码的实现


typedef struct stack
{
	char* a;
	int top;
	int capacity;
}ST;

void InitST(ST* s)
{
	assert(s);
	s->a = (char*)malloc(sizeof(char) * 4);
	if (s->a == NULL)
	{
		perror("malloc fail");
		return;
	}

	s->capacity = 4;
	s->top = -1;///top记录指向的当前元素
}

bool STEmpty(ST* s)
{
	assert(s);
	if (s->top == -1)
		return true;
	return false;
}

void Push(ST* s, char x)
{
	assert(s);

	if (s->top + 1 == s->capacity)
	{
		s->a = (char*)realloc(s->a, sizeof(char) * s->capacity * 2);
		if (s->a == NULL)
		{
			perror("malloc fail");
			return;
		}
		s->capacity *= 2;
	}
	s->a[s->top + 1] = x;
	s->top++;

}

char STTop(ST* s)
{
	assert(s);

	return s->a[s->top];
}
void Pop(ST* s)
{
	assert(s);
	assert(!STEmpty(s));

	s->top--;
}
bool isValid(char* s) {
	ST ps;
	InitST(&ps);
	int len = strlen(s);
	int cur = 0;
	int count = 0;
 	while (len--)
	{
		if (s[cur] == ')' || s[cur] == ']' || s[cur] == '}')
		{
			if (STEmpty(&ps))
			{
				return false;
			}
			if (s[cur] == ')')
			{
				if(STTop(&ps)=='(')
					Pop(&ps);
				else
				    return false;

			}
			else if (s[cur] == ']')
			{
				if (STTop(&ps) == '[')
					Pop(&ps);
				else
				    return false;

			}
			else if (s[cur] == '}')
			{
				if (STTop(&ps) == '{')
					Pop(&ps);
                else
				    return false;

			}
			else
				return false;
		}

		if (s[cur] == '(' || s[cur] == '[' || s[cur] == '{')
		{
			Push(&ps, s[cur]);
		}
		count++;
		cur++;

	}
	if (STEmpty(&ps))
		return true;
	else
		return false;
}
  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aomnitrix

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值