力扣有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 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
二维码