括号匹配

shengtianpo 2017-12-30 11:32:17
题目:第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[", "]", "(", ")" 四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])
样例输出
No
No
Yes
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char str[1000],check[1000];
int i,j,k;
int n;
scanf("%d",&n);
for(k=0;k<n;k++){
j=-1;
scanf("%s",str);
for(i=0;i<strlen(str);i++){
if(str[i]=='('||str[i]=='['){
j++;
check[j]=str[i];
}
//printf("%d,%c",j,check[j-1]);
if(str[i]==']'){
if(j<0)
{
printf("No\n");
break;
}
else
if(check[j]!='['){
printf("No\n");
break;
}
else
j--;
}
if(str[i]==')'){
if(j<0)
{
printf("No\n");
break;
}
if(check[j]!='('){
printf("No\n");
break;
}
else
j--;
}
}
if(i==strlen(str)&&j==-1)
printf("Yes\n");
else if(i==strlen(str)&&j>-1)
printf("No\n");
}
}


我运行结果是:
我题交上去给系统检测,
是错的,各位大神帮帮忙,看我错在哪里了,我都修改了好几次了,都找不到原因
...全文
1059 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-01-03
  • 打赏
  • 举报
回复
仅供参考:
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define STACK_INIT_SIZE 10
#define STACK_GROW_SIZE 5
#define ELEMTYPE char
#define OK 1
#define ERROR 0
typedef struct { /*建立一个栈的首结点*/
    ELEMTYPE * base;
    ELEMTYPE * top;
    int stacksize;
} SpStack;
int InitStack(SpStack *s) { /*建立空的栈并返回首地址*/
    s->base=((ELEMTYPE*)malloc(STACK_INIT_SIZE*sizeof(ELEMTYPE)));
    if (!s->base) return ERROR;
    s->top=s->base;
    s->stacksize=STACK_INIT_SIZE;
    return OK;
}
int StackEmpty(SpStack *s) { /*判断栈是否为空*/
    if (s->top==s->base) return OK;
    else                 return ERROR;
}
int Push(SpStack *s,ELEMTYPE e) { /*往栈顶插入元素即进栈*/
    if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/
        s->base=((ELEMTYPE*)realloc(s->base,(s->stacksize+STACK_GROW_SIZE)*sizeof(ELEMTYPE)));
        if (!s->base) return ERROR;
        s->stacksize+=STACK_GROW_SIZE;
        s->top=s->base+s->stacksize;
    }
    *s->top++=e;
    return OK;
}
int Pop(SpStack *s,ELEMTYPE *e) { /*让栈顶元素依次输出即出栈*/
    if (StackEmpty(s)) return ERROR;
    *e=*(--s->top);
    return OK;
}
int Comp(ELEMTYPE a,ELEMTYPE b) {
    if ((a=='('&&b!=')')
      ||(a=='['&&b!=']')
      ||(a=='{'&&b!='}')) {
        return ERROR;
    } else return OK;
}
int Count(SpStack *s) {
    ELEMTYPE e[STACK_INIT_SIZE*2];
    ELEMTYPE e1;
    int i;

    InitStack(s);
    fgets(e,STACK_INIT_SIZE*2,stdin);
    if ('\n'==e[strlen(e)-1]) e[strlen(e)-1]=0;
    printf("%s\n",e);
    for (i=0;e[i]!='\0';i++) {
        switch (e[i]) {
        case '(':
        case '[':
        case '{':
            Push(s,e[i]);
            break;
        case ')':
        case ']':
        case '}':
            if (StackEmpty(s)) {
                printf("%*s↖右括号多余\n",i+1,"");
                return(ERROR);
            } else Pop(s,&e1);
            if (!Comp(e1,e[i])) {
                printf("%*s↖左右匹配出错\n",i+1,"");
                return(ERROR);
            }
        }
    }
    if (!StackEmpty(s)) {
        printf("%*s↖左括号多余\n",i,"");
        return(ERROR);
    } else {
        printf("匹配正确\n");
        return(OK);
    }
}
void main() {
    SpStack s;
    Count(&s);
    free(s.base);
}
开心秋水 2017-12-31
  • 打赏
  • 举报
回复
就是用栈。当读取到一个括号的左半边后,将它入栈。当读取到一个括号的右半边时,将栈顶的元素逐个出栈,直到对应的这种括号的左半边。
全部符号读取完毕后,栈应当是空的。
leetow2006 2017-12-31
  • 打赏
  • 举报
回复
是,我看数据结构里有说,要用堆栈
IT小浪 2017-12-31
  • 打赏
  • 举报
回复
#include<stdio.h> #include<string.h> #define max 200 struct no{ int x,y; }; struct stack{ char *top; char *base; int size; }; no jun(char e) { no m; if(e=='(') { m.x=0; m.y=1; return m; } else if(e==')') { m.x=1; m.y=1; return m; } else if(e=='[') { m.x=0; m.y=2; return m; } else if(e==']') { m.x=1; m.y=2; return m; } else if(e=='{') { m.x=0; m.y=3; return m; } else { m.x=1; m.y=3; return m; } } void set(stack &s) { s.base=new char[max]; s.top=s.base; s.size=max; } void push(stack &s,char e) { *(s.top)=e; s.top++; } char top(stack &s) { return *(s.top-1); } void pop(stack &s) { s.top--; } bool empty(stack &s) { if(s.top==s.base) return true; return false; } int main() { stack S; char a[1000]; int n,g=0; set(S); printf("请输入要检验的内容:"); scanf("%s",a); n=strlen(a); for(int i=0;i<n;i++) { if(jun(a[i]).x==0) { push(S,a[i]); } else { if(empty(S)) { g=1; break; } else { if(jun(top(S)).y==jun(a[i]).y) { pop(S); } else { g=1; break; } } } } printf("检验结果为:"); if(g==0) printf("匹配\n"); else printf("此串括号匹配不合法\n"); return 0; }
幻夢之葉 2017-12-31
  • 打赏
  • 举报
回复
可以使用栈的思想写,简洁清晰

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧