括号()
的组合千奇百怪,Drizzle 想知道各种组合的括号可以是否合法
合法要求:每个同类型的左括号必须有与之对应的同类的右括号以正确的顺序闭合
输入:输入一个括号字符串
输出:输出是否合法,是则True
,否则False
输入:
(){}[]
输出:
True
对于 100% 的数据:括号字符串长度 ≤ 100
#include
using namespace std;
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef char selemtype;
typedef struct{
selemtype *base;
selemtype *top;
int stacksize;;
}sqstack;
int initstack(sqstack &s)
{
s.base=new selemtype[MAXSIZE];
if(!s.base){
exit(OVERFLOW);
}
s.top=s.base;
s.stacksize=MAXSIZE;
return OK;
}
int push(sqstack &s,selemtype e)
{
if(s.top-s.base==s.stacksize){
return ERROR;
}
*s.top=e;
s.top++;
return OK;
}
int pop(sqstack &s,selemtype &e){
if(s.top==s.base){
return ERROR;
e=*--s.top;
}
e=*--s.top;
return OK;
}
int main()
{
char str[100];
scanf("%[^\n]",str);//%[^\n]是一个格式说明符,%表示一个格式说明符的开始
//[^\n]是一个扫描集,^是扫描集的否定,意味着这个扫描集
//会匹配任何不在方括号内的字符
sqstack s;
initstack(s);
int flag=1;//如果flag为1则匹配,反之。
int t=0;//判断数组中是否有括号
int i=0;
char e;
while(str[i]!='\0'){
switch (str[i]){
case '(':{
push(s,'(');
t=1;
break;
}
case '[':{
push(s,'[');
t=1;
break;
}
case '{':{
push(s,'{');
t=1;
break;
}
case ')':{
pop(s,e);
if(e!='('){
flag=0;
}
break;
}
case ']':{
pop(s,e);
if(e!='['){
flag=0;
}
break;
}
case '}':{
pop(s,e);
if(e!='{'){
flag=0;
}
break;
}
default:break;
}
i++;
}
if(flag && (s.top==s.base) && t){
printf("True");
}
else{
printf("False");
}
return 0;
}
1.因为我们使用结构体定义sqstack的时候,并没有把它定义成指针,所以之后的取值都用'.'
在函数调用的时候,我们用的‘&’,所以在每个函数中也使用‘.'如果我们用的‘*’,则我们在函数中可以使用‘->'。
2.将值传递给参数时,如果参数定义为*,则调用参数的时候需要给参数前面加上‘&’,否则,参数定义为‘&’,则调用参数时参数前面不需要加‘&’。