题目描述
输入一串字符串(长度不超过50),其中有普通的字符与括号组成(包括‘(’、‘)’、‘[’,']'),要求验证括号是否匹配,如果匹配则输出0、否则输出1。
注意不要有不必要的输出,比如“请输入字符串”。
输入
一行字符串。
输出
一个整数表示答案
输入样例: dfa(sdf)df[dfds(dfd)] // 匹配
输出样例: 0
大致分析:
①首先对于括号的匹配是其对于的 ' ( ' 与 ' ) ' ' [ ' 与 ' ] ' 的匹配,再关于其是否括号匹配,就是字符串中的 括号是否规范匹配 (即每输入一个‘( ’ 需要找到另一个 ‘ )’ )
②每当一对括号匹配后,该对括号间的任何字符(除括号外)即可消除(不再考虑)
例如: 区别 ([) (括号不匹配) 与 (a) (括号匹配)
此外 关于除括号外的其他字符就不需要多加考虑。
过程(运用数据结构栈)
每当输入一个字符,将这个字符入栈,当碰到 ' ( ' 或者 ‘ [ ’ (左括号),记录下来,寻找对应的 ' ) ' ' ] ' ,若未出现‘( ’ 或者 ‘ [ ' (左括号) 而直接遇到了 ' ) ' ' ] '(右括号),则直接不匹配,输出 1
当一对括号匹配后,括号内的字符进行出栈操作,当进行到最后时,若最后的字符串中不再包含括号则为括号匹配,否则不匹配
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Sqstack
{
char data[51];
int top;
}Sqstack;
int l,flag1,flag2;
char ch1[10001];
void push(Sqstack &s,char x) {s.data[++s.top]=x;} // 入栈操作
char pop(Sqstack &s) {return s.data[s.top--]; } // 弹出栈顶操作
char gettop(Sqstack &s) {return s.data[s.top];} // 访问栈顶操作
int main()
{
Sqstack s;
scanf("%s",ch1);
l=strlen(ch1);
for(int i=0;i<l;i++)
{
push(s,ch1[i]); // 入栈
if(ch1[i]=='(') flag1++; //碰到一个左括号 左括号个数++ 出现情况: (()) 因此需要记录个数
if(ch1[i]==')' ) // 出现右括号
{
if(flag1) //若栈前面出现左括号
{
while(pop(s)!='(') // 弹出栈顶直至左括号
{
if(gettop(s)=='[' || gettop(s)==']') // 若左括号中间出现 其他括号 直接无效(括号不匹配)
{
printf("1");
return 0;
}
}
flag1--; // 一对括号匹配成功,记录左括号减少
}
else // 前面没有出现左括号,而直接出现右括号,必定不匹配
{
printf("1");
return 0;
}
}
if(ch1[i]=='[') flag2++; // 与上面同理出现 左中括号
if(ch1[i]==']')
{
if(flag2)
{
while(pop(s)!='[')
{
if(gettop(s)=='(' || gettop(s)==')')
{
printf("1");
return 0;
}
}
flag2--;
}
else
{
printf("1");
return 0;
}
}
}
if(flag1==0 && flag2==0) //剩余字符中没有 左括号括号
printf("0");
else printf("1");
return 0;
}