力扣有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
 

示例 1:

输入:s = "()"
输出:true
示例 2:

输入:s = "()[]{}"
输出:true
示例 3:

输入:s = "(]"
输出:false
示例 4:

输入:s = "([)]"
输出:false
示例 5:

输入:s = "{[]}"
输出:true

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses

思路:

这道题最难的点不仅在于括号要匹配,还要合法,例如:([)]  这种情况虽然左括号和右括号数量是一样的,但是他们是不合法的。

所以栈结构是最适合做这道题的,后入栈的左括号优先和先出现的右括号匹配。

由于楼主初学编程,暂时只会C语言,只能手扣个栈......

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define STACK_INIT_SIZE 100//存储空间初始化分配量
#define STACKINCREMENT 10//存储空间增加分配量
typedef char SElemType;
typedef int Status;
typedef struct{
    SElemType *base;//栈底
    SElemType *top;//栈顶
    int stacksize;//当前已分配的存储空间
}sqStack;

Status InitStack(sqStack *S){
    //创建一个栈
    S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
    if(!S->base){//如果分配不到空间
        exit(OVERFLOW);
    }
        S->top = S->base;
        S->stacksize = STACK_INIT_SIZE;
        return OK;
}
Status DestroyStack(sqStack *S){
    //摧毁栈
    int i,len;
    len = S->stacksize;
    for(i = 0;i < len;i++){
        free(S->base);
        S->base++;
    }
    S->top = S->base = NULL;
    S->stacksize = 0;
    return OK;
}

Status Push(sqStack *S,SElemType e){
    //入栈
    if((S->top) - (S->base) >= (S->stacksize)){
        S->base = (SElemType *)realloc(S->base,((S->stacksize) + STACKINCREMENT) * sizeof(SElemType));
        if(!S->base){
            exit(OVERFLOW);
        }
        S->top = S->base + S->stacksize;
        S->stacksize += STACKINCREMENT;
 }
    *(S->top) = e;
    (S->top)++;
    return OK;
}
Status Pop(sqStack *S,SElemType *e){
    //弹栈
    if(S->base == S->top){
        return ERROR;
    }
    *e = *--(S->top);
    return OK;
}
Status StackEmpty(sqStack *S){
    //判断是否为空栈
    if(S->top == S->base){
        return TRUE;
    }
    return FALSE;
}

bool isValid(char * s){//第一次做力扣题,我的理解就是力扣编译器输入的东西存入s这个数组里
    int i;
    char ch;
    sqStack s1;
    InitStack(&s1);
    for( i = 0; i < strlen(s);i++){
        switch(s[i]){
            case '(':Push(&s1,s[i]);break;
            case ')':{
                if(!Pop(&s1,&ch)){//Pop返回的是0的话,说明栈为空
                return false;
            }
                if(ch != '('){//栈弹出的元素和这个括号不匹配的话说明括号不合法
                    return false;
                    }break;
            }
            
            case '[':Push(&s1,s[i]);break;
            case ']':{
                if(!Pop(&s1,&ch)){
                return false;
            }
                if(ch != '['){
                    return false;
                    }break;
            }
            
            case '{':Push(&s1,s[i]);break;
            case '}':{
                if(!Pop(&s1,&ch)){
                return false;
            }
                if(ch != '{'){
                    return false;
                    }break;
            }
            
        }
    }
    if(!StackEmpty(&s1)){//判断栈是否为空
        return false;
    }
    return true;//所有以上情况以外就是真了
}

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>