第一次写博客不知道该写点什么,就准备记录一些关于数据结构(C语言)中栈的操作——初始化、判空、入栈、出栈、和栈顶元素。
括号配对问题
时间限制:3000 ms | 内存限制:65535 KB
难度:3
描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])
样例输出
No
No
Yes
1.取出一个字符,如果是左括号(如 ‘(’,’[’,’{’),则压入栈中。
2.如果是右括号,则与栈顶元素进行配对,在这里会出现两种情况。
(1).如果栈空,说明括号不配对,直接返回判断结果。
(2).栈不为空,则判断是否配对,配对则将栈顶元素出栈,不配对返回判断结果。
3.重复操作,直到字符串最后一个字符,返回判断结果。
代码如下:
#include<stdio.h>
#include<string.h>
#define Maxsize 10010
typedef char datatype;
typedef struct{
datatype data[Maxsize];
int top;
}Stack;
void Init(Stack *S) //栈初始化
{
S->top=-1;
}
int Empty(Stack *S) //栈的判空 这里1为空
{
if(S->top==-1)
return 1;
else
return 0;
}
int Push (Stack *S,datatype x) //元素入栈
{
if(S->top==Maxsize-1)
return 0;
else S->data[++(S->top)]=x;
return 1;
}
void Pop(Stack *S, datatype *x) //元素出栈
{
*x=S->data[(S->top)];
S->top--;
}
void Top(Stack S,datatype *x) //栈顶元素
{
*x=S.data[S.top];
}
int kuohao(Stack *S,char *str)
{
Init(S);
char e;
int i=0;
while(str[i]!='\0')
{
switch(str[i])
{
case '(':
case '{':
case '[': Push(S,str[i]); break; //左括号入栈
case ')': Pop(S,&e);
if(e!='(') return 0;
break;
case '}': Pop(S,&e);
if(e!='{') return 0;
break;
case ']': Pop(S,&e);
if(e!='[') return 0;
break;
default: break;
}
i++;
}
return Empty(S) ; //判断最后栈是否为空
}
int main()
{
Stack S;
char str[Maxsize];
int h, T;
scanf("%d", &T);
while(T--)
{
scanf("%s",str);
h=kuohao(&S,str);
if(h==0)
printf("No\n");
else
printf("Yes\n");
}
return 0;
}
嘿嘿,新手小白第一次写文章,有点小激动,借鉴了一些文章的格式,如发现有错误的地方,还请多多指教。