题目描述
字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必须是<>,(),[],{},例如。输入: [()] 输出:YES,而输入([]), ([])都应该输出NO。
输入
文件的第一行为一个整数n,表示以下有多少个由括好组成的字符串。接下来的n行,每行都是一个由括号组成的长度不超过255的字符串。
输出
在输出文件中有N行,每行都是YES或NO。
样例输入
5 {}{}<><>()()[][] {{}}{{}}<<>><<>>(())(())[[]][[]] {{}}{{}}<<>><<>>(())(())[[]][[]] {<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]] ><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
样例输出
YES YES YES YES NO 题目:要求用栈,但是和前2题括号匹配不同,要区别括号的顺序,我用的一个show()函数,当你要入栈的时候查看一下栈顶元素的括号和入栈的括号是否满足顺序,若不满足则把FLAG为ERROR直接break退出循环,p.s这里加了FLAG标志位因为不加话的退出循环就不太好判断。其他的和上提类似。此方法有点笨拙,就一直判断就行了
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#define maxsize 255
#define ERROR 0
#define OK 1
typedef struct stack
{
int top;
char arr[maxsize];
}STACK ;
void init(STACK * ps);
void string_match(STACK *ps);
bool push(STACK * ps,char val);
char show_topElemt(STACK *ps);
bool pop(STACK * ps,char *val);
int main()
{
STACK st ;
init(&st);
string_match(&st);
}
void init(STACK * ps)
{
ps->top=-1 ;
}
void string_match(STACK *ps)
{
int i,j,num;
int flag =ERROR ;
char val ;
char ch[maxsize];
scanf("%d",&num); //5行字符串
for(i=0;i<num;i++)
{
flag = OK ;
memset(ps,0,sizeof(STACK));
init(ps);
memset(ch,0,sizeof(ch));
scanf("%s",ch);
for(j=0;j<strlen(ch);j++)
{
if(ch[j]==‘<‘)
{
push(ps,ch[j]);
}
else if(ch[j]==‘(‘)
{
if(show_topElemt(ps)==‘<‘)
{
flag = ERROR ;
break;
}
else
{
push(ps,ch[j]);
}
}
else if(ch[j]==‘[‘)
{
if(show_topElemt(ps)==‘(‘||show_topElemt(ps)==‘<‘)
{
flag = ERROR ;
break;
}
else
{
push(ps,ch[j]);
}
}
else if(ch[j]==‘{‘)
{
if(show_topElemt(ps)==‘(‘ || show_topElemt(ps)==‘[‘|| show_topElemt(ps)==‘<‘)
{
flag = ERROR ;
break;
}
else
{
push(ps,ch[j]);
}
}
else if(ch[j]==‘>‘)
{
if(pop(ps,&val))
{
if(val!=‘<‘)
{
flag = ERROR ;
break;
}
}
else
{
flag = ERROR ;
break;
}
}
else if(ch[j]==‘)‘)
{
if(pop(ps,&val))
{
if(val!=‘(‘)
{
flag = ERROR ;
break;
}
}
else
{
flag = ERROR ;
break;
}
}
else if(ch[j]==‘]‘)
{
if(pop(ps,&val))
{
if(val!=‘[‘)
{
flag = ERROR ;
break;
}
}
else
{
flag = ERROR ;
break;
}
}
else if(ch[j]==‘}‘)
{
if(pop(ps,&val))
{
if(val!=‘{‘)
{
flag = ERROR ;
break;
}
}
else
{
flag = ERROR ;
break;
}
}
}
if(ps->top ==-1 && flag == OK) printf("YES\n");
else printf("NO\n");
}
}
bool push(STACK * ps,char val)
{
if(ps->top == maxsize-1)
{
return false;
}
else
{
ps->arr[++ps->top]=val;
return true ;
}
}
char show_topElemt(STACK *ps)//只展示栈顶的一个元素,但是不动里面的元素和指针
{
char ch ;
ch =ps->arr[ps->top];
return ch ;
/*
if(ps->top == -1)
{
printf("栈为空");
}
else
{
}*/
}
bool pop(STACK * ps,char *val)
{
if(ps->top == -1)
{
return false;
}
else
{
*val=ps->arr[ps->top--];
return true ;
}
}
原文地址:https://www.cnblogs.com/cocobear9/p/12588856.html