资源简介

某个序列完全由圆括号组成,一个“(”和“)”称为一对括号,且序列中的括号成对出现。设n为序列中出现的括号对数,k为序列中括号的最大嵌套深度;那么,序列“((()()()))()(())”的n为8,k为3,请编程判断任意给定的圆括号序列是否是一个深度为k的序列,如果是一个深度为k的序列,还要求输出其括号的对数。 (1)先输入嵌套深度k,然后输入任意一个序列,最后给出判定结果(是,不是,或者输入序列中的括号不配对) (2)可以反复输入数据,当k=0时,程序结束。当k≠0时输入示例: 3 ((()()()))()(()) 2 (((()()()))())(()) 5 (()()()))()((((())))) 输出的判定结果: 测试1:是一个深度为3的括号序列,括号对数为8 测试2:不是一个深度为2的括号序列,是一个深度为4的括号序列,括号对数为9 测试3:括号不配对

资源截图

代码片段和文件信息

#include 
#include 

typedef struct
{
    char *S;
int top;
int base;
int size;
}stack;

stack *OPTR;

int pro_depth;//获取用户输入的序列深度

void InitStack(stack *st)
{
    st->S = (char*)malloc(20*sizeof(char));
if(!st->S) exit(1);
st->top = st->base = 0;
st->size = 20;
}
/*操作结果:构造一个空栈st*/

void Push(stack *stchar c)
{
    if(st->top - st->base >= st->size)
{
    st->S = (char*)realloc(st->S(st->size + 10) * sizeof(char));
if(!st->S) exit(1);
st->size += 10;
}
st->S[st->top] = c;
st->top++;
}
/*初始条件:栈st已存在
  操作结果:插入元素c为新的桟顶元素
*/

char Gettop(stack *st)
{
char e;
if(st->top == 0 && st->base == 0)
{
exit(1);
}
e = st->S[st->top-1];
return e;
}
/*初始条件:栈st已存在且非空
  操作结果:用e返回st的桟顶元素
*/


void Pop(stack *st)
{
if(st->top == st->base)
exit(1);
else
{
st->top--;
}
}
/*初始条件:栈st已存在且非空
  操作结果:删除st的桟顶元素
*/

void JudgementResult(stack *stint a int b)
{
if(st->S[st->top-1] == ‘#‘)//若栈st中只有‘#’,则证明匹配成功,否则失败
{
if((b-1) == pro_depth)//若根据序列所求得的深度与用户给定深度相等,则输出是该深度的序列,否则不是
{
    printf(“您输入的序列是一个深度为%d的圆括号序列,括号对数为%d\n“b-1a);
getchar();
}
else
{
printf(“您输入的序列不是一个深度为%d的圆括号序列,是一个深度为%d的序列,括号对数为%d\n“pro_depthb-1a);
getchar();
}
}
else
{
printf(“您输入的序列不是匹配的圆括号序列!“);
getchar();
}
pro_depth = 0;
}
/*
  操作结果:判断括号序列是否匹配
*/

void ParenthesisMatch()
{
char c;//获取用户输入的序列字符
char a;//获取栈st顶字符
int count1 = 0;//定义栈st当前深度,并取最大值作为序列深度
    int count2 = 0;//定义括号对数
    int depth = 0;//定义序列深度,该深度为count2的最大值
InitStack(OPTR);
Push(OPTR‘#‘);//现将一个‘#‘压入栈st中,用以最后判定圆括号是否全部出栈
printf(“请输入一个完全由圆括号组成的序列以‘#’表示结束:\n“);
c = getchar();
while(c != ‘#‘)//判断是否读取到括号序列的最后一个字符,读到‘#’时,结束循环
{
if(c != ‘)‘ && c != ‘(‘)//排除其他字符的干扰
{
printf(“请输入正确的格式!\n“);
exit(0);
}
else
{
    a = Gettop(OPTR);//读取栈st顶元素
    if(c == ‘(‘ || a == ‘#‘)//若桟顶元素为‘(’或‘#’,直接压入栈S中,记录

评论

共有 条评论