首页 > 编程语言 >每日一道算法题(栈)

每日一道算法题(栈)

时间:2024-10-21 19:17:39浏览次数:9  
标签:ps arr top Stack char 一道 算法 每日 stack

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

题目 

分析 

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

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

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

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

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

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

 代码实现

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;
}

致谢

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

标签:ps,arr,top,Stack,char,一道,算法,每日,stack
From: https://blog.csdn.net/hsy1603914691/article/details/143123486

相关文章

  • 信息学奥赛复赛复习18-CSP-J2023-01小苹果-向上取整、向下取整、模拟算法
    PDF文档公众号回复关键字:202410211P9748[CSP-J2023]小苹果[题目描述]小Y的桌子上放着n个苹果从左到右排成一列,编号为从1到n。小苞是小Y的好朋友,每天她都会从中拿走一些苹果。每天在拿的时候,小苞都是从左侧第1个苹果开始、每隔2个苹果拿走1个苹果。随......
  • 【重拾算法第一天】质数&&约数&&欧拉筛 埃氏筛&&GCD
    1.素数素数(PrimeNumber)是指大于1的自然数,只有两个正因数:1和它自身。换句话说,素数是不能被其他自然数整除的数。1.1小素数的判定判定一个数是否为素数,当N≤  时,用试除法,当n>  时,用Miller_Rabin算法根据素数的定义,可以直接得到试除法,用[2,n-1]内的所有数着......
  • 【算法】树链剖分
    1.算法简介树链剖分为将树分割成若干条链,维护树上信息的思想。通常将其分为链后能用数据结构维护。树链剖分分为重链剖分,长链剖分,实链剖分。通常重链剖分最常用,本文主要介绍重链剖分。重链剖分可将树划分为一个个长度不超过\(O(\logn)\)的链,并且保证每条链内的\(dfs\)序......
  • 代码随想录算法训练营Day39 | 卡玛网-46.携带研究材料、416. 分割等和子集
    目录卡玛网-46.携带研究材料416.分割等和子集卡玛网-46.携带研究材料题目卡玛网46.携带研究材料(第六期模拟笔试)题目描述:小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包......
  • 【数据结构】动态规划:揭开算法优化的秘密
    在算法世界中,动态规划(DynamicProgramming,DP)无疑是一个充满魅力的思想,特别是在解决复杂的优化问题时,它展现出了极大的威力。它不仅能优化问题的求解速度,还能通过减少重复计算来提高效率。然而,对于很多初学者来说,动态规划常常显得有些晦涩难懂。本文将通过浅显的例子,帮助你......
  • 代码随想录算法训练营第六天| leetcode242.有效的字母异位词、leetcode349.两个数组的
    1.leetcode242.有效的字母异位词题目链接:242.有效的字母异位词-力扣(LeetCode)文章链接:代码随想录视频链接:学透哈希表,数组使用有技巧!Leetcode:242.有效的字母异位词_哔哩哔哩_bilibili自己的思路:首先就是对字符串进行分开成一个一个单独的字母,然后使用列表存储这些数据,再对......
  • LeetCode刷题日记之贪心算法(五)
    目录前言无重叠区间划分字母区间合并区间单调递增的数字监控二叉树总结前言随着对贪心算法的不断深入,本篇文章将继续挑战一些经典的题目,进一步巩固这一算法的应用技巧。希望博主记录的内容能够帮助大家更好地掌握贪心算法的解题思路✍✍✍无重叠区间LeetCode题目......
  • GCN(图卷积神经网络)中的**信息聚合**和传统聚类算法是不同的概念,尽管它们都涉及到将某
    GCN(图卷积神经网络)中的信息聚合和传统聚类算法是不同的概念,尽管它们都涉及到将某些对象的信息整合在一起。下面我将详细解释两者的差异:1.GCN中的信息聚合GCN中的信息聚合过程是节点级别的邻居信息融合,主要目的是通过图的拓扑结构更新节点的特征表示。每个节点通过其邻......
  • python 实现RGB和HSV相互转换算法
    RGB和HSV相互转换算法介绍RGB和HSV之间的相互转换算法可以通过一系列的数学计算来实现。以下是对这两种色彩空间之间转换的基本算法的概述:RGB到HSV的转换1、归一化RGB值:首先,将RGB值从范围[0,255]归一化到[0,1]。这可以通过将每个颜色分量除以255来实现。2、计算明度V......
  • 算法专题九: 哈希表与字符串
    目录哈希表1.两数之和2.判断是否为字符重拍排3.是否存在重复元素4.存在重复元素Ⅱ5.字母异位词分组字符串1.最长公共前缀2.最长回文子串3.二进制求和4.字符串相乘哈希表1.两数之和固定一个数,找前面有没有target-x这个数,使用哈希表,每次查找之后......