题目要求:
给定一个字符串,其中的字符只包含三种括号:花括号{ }、中括号[ ]、圆括号( ),即它仅由 “( ) [ ] { }” 这六个字符组成。设计算法,判断该字符串是否有效,即字符串中括号是否匹配。括号匹配要求括号必须以正确的顺序配对,如 “{ [ ] ( ) }” 或 “[ ( { } [ ] ) ]” 等为正确的格式,而 “[ ( ] )” 或 “{ [ ( ) }” 或 “( { } ] )” 均为不正确的格式。
代码如下:
#include<stdio.h>
#include<string.h>#include<stdlib.h>#define N 100#define OK 1#define ERROR 0typedef char ElemType;typedef struct{ ElemType data[N]; int top;} SqStack;//初始化栈void Init(SqStack *s){ s = (SqStack *)malloc(sizeof(SqStack)); s -> top = -1;}//进栈int push(SqStack *s,ElemType n){ if(s -> top == N - 1) return ERROR; s -> top ++; s -> data[s -> top] = n; return OK;}
//出栈int pop(SqStack *s,ElemType *n){ if(s -> top == -1) return ERROR; *n = s -> data[s -> top]; s -> top --; return OK;}//判断栈是否为空int empty(SqStack *s){ return (s -> top == -1);}//括号匹配void match(SqStack *s,ElemType *str){ int flag = 0,i = 0; //flag == 1不匹配 ElemType n; while(i < (int)strlen(str) && strlen(str) % 2 == 0) { switch(str[i]) { case '(': case '[': case '{': push(s,str[i]); break; case ')': pop(s,&n); if(n != '(') flag=1; break; case ']': pop(s,&n); if(n != '[') flag=1; break; case '}': pop(s,&n); if(n != '{') flag=1; break; default: flag=1; break; } if(flag) break; i++; } if(flag == 0 && empty(s) == 0 && strlen(str) % 2 == 0) printf("括号匹配成功!\n"); else printf("括号匹配失败!\n");}int main(){ SqStack s; Init(&s); //初始化 ElemType str[N]; printf("请输入括号:\n"); gets(str); match(&s,str); return 0;
}
运行结果: