当前位置: 首页 > article >正文

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

题目:

解题思路:

        首先要明确一个问题:配对的左右括号不一定是相邻的,例如: ( [ ] ) 。

        由上述,'(','[','{' 可能不会在遍历整个字符串的过程中,立即找到配对的括号。括号的配对原则是:当遍历到右括号时去看后出现的左括号是否与之配对,那么很容易想到满足后进先出的特点的结构为栈。

        首先定义一个栈的结构体,为栈和栈的存储空间(根据题目中的提示,存储空间定义足够大)以malloc申请空间并进行初始化。遍历整个字符串,当遇到左括号时,进行入栈操作,当遇到右括号时,进行出栈操作(主要出栈前进行判空操作,防止非法访问空间地址)。遍历完成后,栈中如果还有剩余元素,证明左括号多于右括号,返回false。

        不满足有效括号规则的情况:

        1、当传入字符串长度为奇数时,一定不满足有效括号的规则,返回false。

        2、当遍历到右括号,发现栈为空,已经没有左括号与之配对,返回false。

        3、当遍历到右括号,发现栈顶元素不能与之配对,返回false。

        4、遍历完整个字符串以后,栈中如果还有剩余元素,证明左括号多于右括号,返回false。

代码:

typedef struct
{
    char *data;//栈的存储空间
    int count;//栈中元素数量
    int top;//栈顶
}stack;
bool isValid(char *s)
{
    if(strlen(s) == 0)
        return true;
    if(strlen(s) % 2 == 1)
        return false;
    stack *sta = (stack *)malloc(sizeof(stack));//创建栈
    sta->count = 0;
    sta->top = -1;
    sta->data = (char *)malloc(sizeof(char) * 10000);//初始化栈
    while(*s)
    {
        if(*s == '(' || *s == '[' || *s == '{')
        {
            sta->data[sta->top+1] = *s;//入栈
            sta->top++;
            sta->count++;
        }
        if(*s == ')')
        {
            if(sta->top == -1) 
                return false;//判空
            if(sta->data[sta->top] == '(')
            {
                sta->top--;//出栈
                sta->count--;
            }
            else
                return false;
        }
        if(*s == ']')
        {
            if(sta->top == -1) 
                return false;//判空
            if(sta->data[sta->top] == '[')
            {
                sta->top--;//出栈
                sta->count--;
            }
            else
                return false;
        }
        if(*s == '}')
        {
            if(sta->top == -1) 
                return false;//判空
            if(sta->data[sta->top] == '{')
            {
                sta->top--;//出栈
                sta->count--;
            }
            else
                return false;
        }
        s++;
    }
    if(sta->count != 0)
        return false;
    else
        return true;
}

http://www.kler.cn/a/402464.html

相关文章:

  • 【1.3 Getting Started--->Release Notes】
  • 单点修改,区间求和或区间询问最值(线段树)
  • HTML飞舞的爱心
  • 正则表达式灾难:重新认识“KISS原则”的意义
  • 直播技术-Android基础框架
  • 第四份工作的环境配置
  • 全面解析亚马逊云服务器(AWS):功能、优势与使用指南
  • 【Vue 表单类组件封装与 v-model 简化代码】
  • 使用vue-i18n为你的Vue应用添加多语言支持
  • 爬虫基础总结 —— 附带爬取案例
  • 青训营刷题笔记11
  • 笔记02----重新思考轻量化视觉Transformer中的局部感知CloFormer(即插即用)
  • linux安装docker并配置docker源
  • 保姆级Redis安装教程
  • QT基础 窗体 对话框 文件 QT5.12.3环境 C++实现
  • CTF攻防世界小白刷题自学笔记16
  • windows和git不区分文件名大小写问题
  • 字符串加法
  • 用jquery做一个websocket客户端
  • 一.安装版本为19c的Oracle数据库管理系统(Oracle系列)
  • Huggingface load_dataset加载本地数据集
  • 01 P1048 [NOIP2005 普及组] 采药
  • 02 P1734 最大约数和
  • 梧桐数据库加密算法支持与实践应用
  • 印刷物料学习Ⅰ~
  • 【Vue3组件通信方法】