LeetCode 20. 有效的括号

有效的括号 题目链接

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例 1:
输入: “()”
输出: true

思路讲解

用单链表模拟栈的压栈和出栈,当输入为左括号时执行压栈,读取到右括号则进行比较,如果和栈顶(链表首结点)存储的括号对应上则出栈,无对应入栈。

单链表与栈特性吻合,只在数据的一边操作,头结点插入与压栈后进先出的操作对应。

struct list
{
	char val;
	struct list* next;
};
bool IsBH(char cr1, char cr2)
{
	return (cr1 == '['&&cr2 == ']') || (cr1 == '{'&&cr2 == '}') || (cr1 == '('&&cr2 == ')');
}
bool isValid(char* s) {
	struct list *p;
	p = NULL;
	for (int i = 0; s[i] != '\0'; i++)
	{
		if (p == NULL)
		{
			struct list *node = (struct list*)malloc(sizeof(struct list));
			node->val = s[i]; node->next = NULL;
			p = node;
		}
		else if (IsBH(p->val, s[i]))
		{
			p = p->next;
		}
		else {
			struct list *node = (struct list*)malloc(sizeof(struct list));
			node->val = s[i]; node->next = p;
			p = node;
		}
	}
	if (p == NULL) return true;
	else
	{
		while (p)
		{
			struct list* node = p;
			p = p->next;
			free(node);

		}
	}
	return false;
}

代码优化

当读入右括号无对应左括号,就可以直接结束循环,返回 False 减少不必要的内存消耗

struct list//定义单链表
{
	char val;
	struct list* next;
};
bool IsBH(char cr1, char cr2)//判断括号是否为闭合
{
	return (cr1 == '['&&cr2 == ']') || (cr1 == '{'&&cr2 == '}') || (cr1 == '('&&cr2 == ')');
}
bool isValid(char* s) {
	struct list *p;
	p = NULL;
	for (int i = 0; s[i] != '\0'; i++)
	{
		if (s[i] == '{' || s[i] =='['||s[i]=='(')//左半边括号则入栈
		{
			struct list *node = (struct list*)malloc(sizeof(struct list));
			node->val = s[i]; node->next = p;
			p = node;
		}
		else if (p!=NULL&&IsBH(p->val, s[i]))//完整括号则出栈
		{
			p = p->next;
		}
		else {
			return false;//出现右括号且不匹配则无法形成完整括号,返回 false
		}
	}
	if (p == NULL) return true;
	else
	{
		while (p)//释放链表内存
		{
			struct list* node = p;
			p = p->next;
			free(node);

		}
	}
	return false;
}

Java 代码

class Solution {
    public boolean isValid(String s) {
        Stack<Character> sta1=new Stack<>();//定义整数栈
        char[] str=s.toCharArray();//将字符串转换成字符串数组

        for(char cr:str)
        {
            if(cr=='['||cr=='{'||cr=='(')//左括号入栈
                sta1.push(cr);
            else if(sta1.size()!=0&&IsBH(sta1.peek(), cr))//满足完整括号,出栈
                sta1.pop();
            else
               return  false;
        }

        return sta1.size()==0;
    }

    private boolean IsBH(char cr1,char cr2)
    {
        return (cr1=='('&&cr2==')')||(cr1=='{'&&cr2=='}')||(cr1=='['&&cr2==']');
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值