12 有效的括号

21 阅读1分钟

题目

image.png

image.png

思路

  1. 利用栈的特性。

  2. 定义一个辅助数组。

  3. 遍历字符:(若字符的个数为奇数,则直接返回false,因为一定有不匹配的)

    • 若是左括号,则将对应右括号入栈;

    • 若字符还没遍历完辅助数组的top就等于-1(有右括号没有匹配上)或出栈的字符与遍历的字符不相等,则返回false。

    • 否则就出栈(出栈的一定与遍历的相同,否则就会执行上一步,不会执行这步)

  4. 最后返回表达式top==-1。若相等则返回true,若不等(有右括号没有匹配),返回false。

#include<stdio.h>
#include<string.h>
#define MaxSize 1000
//初始化栈
void initStack(char *s,int *top){
	*top=-1;
} 
//入栈
void push(char *s,int *top,char c){
	s[++(*top)]=c;
} 
//出栈
char pop(char *s,int *top){
	return s[(*top)--];
} 
//获取栈顶元素
char getTop(char *s,int *top){
	return s[*top];
} 
//判断括号是否匹配
bool isValid(char *s){
	int len=strlen(s);
	if(len%2!=0)
		return false;
	char st[MaxSize];//辅助栈
	int top=-1;
	for(int i=0; i<len; i++){
		if(s[i]=='(')
			push(st,&top,')');//入栈 
		else if(s[i]=='[')
			push(st,&top,']');
		else if(s[i]=='{')
			push(st,&top,'}');
		else if(top==-1||getTop(st,&top)!=s[i])
			return false;
		else
			pop(st,&top);//出栈 
	} 
	return top==-1; 
} 
int main(){
	char s[]="{}";
	if(isValid(s))
		printf("有效字符");
	else 
		printf("无效字符");
	return 0;
}