题目解析:
给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1: 输入: “()” 输出: true
示例 2: 输入: “()[]{}” 输出: true
示例 4:输入: “([)]” 输出: false
这道题要求是按顺序闭合括号,很容易想到数据结构中的栈。找到闭合的括号就出栈,否则就入栈,最后判断true,false的条件就是判断栈是否为空。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
struct zhan{
char data[100000];
int top;//栈顶指针
};
int enzhan(struct zhan *qu,char x){
qu->top=qu->top+1;
qu->data[qu->top]=x;
return 1;
}//入栈
int dezhan(struct zhan*qu){
qu->top=qu->top-1;
return 1;
}//出栈
bool isValid(char* s) {
struct zhan *p=(struct zhan *)malloc(sizeof(struct zhan));
p->top=0;
if(strlen(s)==0)return true;
enzhan(p,s[0]);
for(int i=1;i<strlen(s);i++)
{
if(p->data[p->top]=='[')
{
if(s[i]==']')dezhan(p);
else enzhan(p,s[i]);
}
else if(p->data[p->top]=='(')
{
if(s[i]==')')dezhan(p);
else enzhan(p,s[i]);
}
else if(p->data[p->top]=='{')
{
if(s[i]=='}')dezhan(p);
else enzhan(p,s[i]);
}
else enzhan(p,s[i]);
}
if(p->top==0)return true;
else return false;
}
int main()
{
char *s=((char*)malloc(sizeof(char*)*10000));
s="[]";
bool i=isValid(s);
printf("%d",i);
}
注意在设置栈顶的时不能设top=-1,否则在判断语句p->data[p->top]时会报错找不到p->data[-1]