数据结构——括号匹配问题
1.问题描述
现在有一行括号序列,请你检查这行括号是否配对。
输入说明
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符。
输出说明
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No。
输出样例
No
No
Yes
1.数据类型
栈的顺序结构–顺序栈
typedef struct{
char data[Maxsize];//栈的最大容量
int top; //栈顶指针
}Sqstack;
2.算法中心思想
(1).初始化一个空栈,顺序读入括号
(2)若是左括号,则压入栈中
(3)若是右括号则与栈顶元素进行匹配(#若匹配,则弹出栈顶元素并进行下一元素 #若不匹配,则该序列不合法)
(4).若全部元素遍历完毕,栈中仍然存在元素,则该序列不合法
(5).每循环一次,要清空栈(重要)
//用顺序栈实现
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
#define N 1001
typedef struct{
char data[N];//栈的最大容量
int top; //栈顶指针
}Sqstack;
//判断栈空
bool StackEmpty(Sqstack S)
{
if (S.top == -1) //栈空
return true;
else
return false; //栈不空
}
//清空栈
void clearstack(Sqstack &s)
{
s.top=-1;
}
//初始化栈
void initstack(Sqstack &s)
{
s.top=-1; //初始化一个空栈
}
//入栈函数
bool push(Sqstack &s, char e)
{
if(s.top==N-1) //栈满
return false;
else //元素入栈
{
s.top++; //栈顶指针先上移
s.data[s.top]=e;//元素进入栈顶
return true;
}
}
//出栈函数
bool pop(Sqstack &s)
{
if(s.top==-1)//栈空
return false;
//e=s.data[s.top];
s.top--;
return true;
}
//取栈顶元素
bool gettop(Sqstack s,char &e)
{
if(s.top!=-1)//栈不空
{
e=s.data[s.top];
return true;
}
}
int main()
{
int n;
Sqstack s;
initstack(s);
char l[1001];
scanf("%d",&n);//输入n组测试数据
char top;//代表栈顶元素
while(n--)
{
scanf("%s",l);//输入序列
//initstack(s);
//先用序列长度进行筛选
if(strlen(l)%2!=0)//序列长度是奇数,则一定是no
printf("No");
else{ //序列长度为偶数
for(int i=0;i<strlen(l);i++)//循环遍历
{
if(l[i]=='('||l[i]=='[')//左括号入栈
push(s,l[i]);
else //是右括号,先与栈顶元素进行匹配
{
gettop(s,top);//用top返回栈顶元素
if((top=='('&&l[i]==')')||(top=='['&&l[i]==']'))//匹配成功,栈顶元素弹栈
pop(s);
else //匹配不上,则no ,并直接退出本次循环
{
//printf("No");
break;
}
}
}
//循环遍历完成后,如果栈空,则是对的
if(StackEmpty(s))
printf("Yes");
else
printf("No");
//clearstack(s);
}
clearstack(s); //每一个序列判断完后,都要清空栈 clearstack(s) ,再判断下一个序列
printf("\n");
}
return 0;
}
写在最后
1.我感觉思路没啥问题啊,测了好几组样例,都感觉没啥问题,但是oj交上去就只有75分,可能是有啥边界没考虑。
希望大家能指点一下!!!很重要,谢谢大家啦!
2.这是本人第一次写博客,比较简短,继续加油啊!坚持写博客,帮助自己学习。