判断一个括号序列中左右括号是否匹配
解题思路:
扫描到左括号则入栈,扫描到右括号则与栈顶的左括号比较,如果匹配则栈顶括号出栈,不匹配则整个序列不匹配。
如果最后栈里还有未匹配的左括号则也是匹配失败。
代码如下:
- #include
- #include
- #define Maxsize 100
-
- typedef struct
- {
- char data[Maxsize];
- int top;
- } SqStack;
-
- void InitStack(SqStack &S)
- {
- S.top=-1;
- }
-
- bool StackEmpty(SqStack S)
- {
- if(S.top==-1) return true;
- else return false;
- }
-
- bool Push(SqStack &S,char x)
- {
- if(S.top==Maxsize-1) return false;
-
- S.data[++S.top]=x;
- return true;
- }
-
- bool Pop(SqStack &S,char &x)
- {
- if(S.top==-1) return false;
-
- x=S.data[S.top--];
- return true;
- }
-
- int main()
- {
- SqStack S;
- InitStack(S);
- StackEmpty(S);
-
- char str[100];
- scanf("%s",str);
-
- // int len;
- // len=strlen(str);
- // printf("len===%d\n",len);
-
- char x;
-
- int flag=0;
-
- for(int i=0;i<strlen(str);i++)
- {
- if( str[i]=='(' || str[i]=='[' || str[i]=='{')//如果是左括号就把它入栈
- {
- Push(S,str[i]);
- }
- else//如果是右括号
- {
- if(StackEmpty(S))//当前栈是空的
- {
- flag=1;
- printf("***匹配失败!\n");
- break;
- }
- // printf("当前栈顶元素是:%c\n",S.data[S.top]);
- // printf("str[i]==%c\n",str[i]);
-
- if(str[i]==')' && S.data[S.top]=='(')//当前栈顶元素是左小括号并且当前读入的是右小括号
- {
- Pop(S,x);
- //printf("当前出栈的栈顶元素是:%c\n",x);
- }
- else if(str[i]==']' && S.data[S.top]=='[')//当前栈顶元素是左中括号并且当前读入的是右中括号
- {
- Pop(S,x);
- //printf("当前出栈的栈顶元素是:%c\n",x);
- }
- else if(str[i]=='}' && S.data[S.top]=='{')//当前栈顶元素是左大括号并且当前读入的是右大括号
- {
- Pop(S,x);
- //printf("当前出栈的栈顶元素是:%c\n",x);
- }
- else
- {
- printf("匹配失败!\n");
- break;
- }
- }
- }
- if(StackEmpty(S) && flag==0)//当前栈是空的
- {
- printf("匹配成功!\n");
- }
-
- return 0;
- }
-
- /*
- [([][])]{}
- [([][]{)]{}
- [([][])]{}}
- */