每日一道算法题(Leetcode 20)

What's past is prologue. 凡是过去,皆为序章。

题目

分析

  1. 我们可以用栈的结构来解决这道题。

  2. 我们使用while循环,每次读取字符串中一个元素进行操作,直到最后读取到 '\0'为止。

  3. 如果遇见 '(', '[' ,'{' 这三种左括号,则把该左括号入栈;如果遇见 ')', ']' ,'}' 这三种右括号,则出栈一个栈中的元素。

  4. 如果出栈的元素与右括号不匹配,则返回 false;如果匹配,则继续进行下一步。比如:这种情况 " ()[} "。

  5. 读取到右括号时,先判断栈中是否还有元素,如果没有元素出来匹配,则说明右括号存在不能匹配情况,则直接返回 false。比如:这种情况 '' ()) "。

  6. 对子字符串的遍历结束之后,需要再去判断栈中是否还有元素,如果有说明左括号存在不能匹配情况,则直接返回 false。比如:这种情况 '' (() "。

代码实现

cpp 复制代码
bool isValid(char* s) 
{
    typedef struct Stack 
    {
        char* arr;
        int capacity;
        int top;
    } Stack;
    void InitStack(Stack * ps) 
    {
        assert(ps);
        ps->arr = NULL;
        ps->capacity = ps->top = 0;
    }
    void PushStack(Stack* ps,char x)
    {
        assert(ps);
        if(ps->capacity == ps->top)
        {
            int newcapacity=ps->capacity==0?4:2*ps->capacity;
            char* tmp=(char*)realloc(ps->arr,sizeof(char)*newcapacity);
            if(tmp==NULL)
            {
                perror("realloc fail");
                exit(1);
            }
            ps->arr=tmp;
            ps->capacity=newcapacity;
        }      
        ps->arr[ps->top++]=x;
    }
    void PopStack(Stack * ps)
    {
        assert(ps);
        assert(ps->top!=0);
        ps->top--;
    }
    char TopStack(Stack * ps)
    {
        assert(ps);
        assert(ps->top!=0);
        return ps->arr[ps->top-1];
    }
    void DestroyStack(Stack * ps)
    {
        assert(ps);
	    if (ps->arr)
        {
		    free(ps->arr);//释放动态数组空间
        }
	    ps->arr = NULL;
	    ps->capacity = ps->top = 0;
    }
    Stack stack;
    InitStack(&stack);
    while(*s!='\0')
    {
        if(*s=='('||*s=='['||*s=='{')
        {
            PushStack(&stack,*s);
        }
        else
        {
            if(stack.top==0)
            {
                DestroyStack(&stack);
                return false;
            }
            char ch=TopStack(&stack);
            if((ch=='('&&*s==')')||(ch=='['&&*s==']')||(ch=='{'&&*s=='}'))
            {
                PopStack(&stack);
            }
            else
            {
                DestroyStack(&stack);
                return false;
            }
        }
        s++;
    }
    if(stack.top!=0)
    {
        DestroyStack(&stack);
        return false;
    }
    DestroyStack(&stack);
    return true;
}

致谢

感谢您花时间阅读这篇文章!如果您对本文有任何疑问、建议或是想要分享您的看法,请不要犹豫,在评论区留下您的宝贵意见。每一次互动都是我前进的动力,您的支持是我最大的鼓励。期待与您的交流,让我们共同成长,探索技术世界的无限可能!

相关推荐
yyt_cdeyyds2 分钟前
FIFO和LRU算法实现操作系统中主存管理
算法
daiyang123...24 分钟前
测试岗位应该学什么
数据结构
alphaTao28 分钟前
LeetCode 每日一题 2024/11/18-2024/11/24
算法·leetcode
kitesxian37 分钟前
Leetcode448. 找到所有数组中消失的数字(HOT100)+Leetcode139. 单词拆分(HOT100)
数据结构·算法·leetcode
VertexGeek1 小时前
Rust学习(八):异常处理和宏编程:
学习·算法·rust
石小石Orz1 小时前
Three.js + AI:AI 算法生成 3D 萤火虫飞舞效果~
javascript·人工智能·算法
jiao_mrswang2 小时前
leetcode-18-四数之和
算法·leetcode·职场和发展
qystca2 小时前
洛谷 B3637 最长上升子序列 C语言 记忆化搜索->‘正序‘dp
c语言·开发语言·算法
薯条不要番茄酱2 小时前
数据结构-8.Java. 七大排序算法(中篇)
java·开发语言·数据结构·后端·算法·排序算法·intellij-idea
今天吃饺子2 小时前
2024年SCI一区最新改进优化算法——四参数自适应生长优化器,MATLAB代码免费获取...
开发语言·算法·matlab