一道简单的C程序

shnaying1945 2016-03-13 10:53:32

括号配对问题

时间限制:3000 ms | 内存限制:65535 KB

难度:3

描述 现在,有一行括号序列,请你检查这行括号是否配对。
输入第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符输出每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No样例输入3
[(])
(])
([[]()])
样例输出
No
No
Yes



#include<iostream>
//#include<stack>
#include<string.h>
#include<stdlib.h>
using namespace std;
int main()
{
int a;
cin>>a;
char*str=new char[10000];
char*A=new char[10000];
for(int i(a);i>0;i--){
cin>>str;
if(strlen(str)%2==1||str[0]==')'||str[0]==']'){
cout<<"No"<<endl;
continue;
}
int j=1;
A[0]=str[0];
int indexA=0;
while(j<strlen(str)){
if(str[j]=='('){
A[++indexA]='(';
}
if(str[j]=='['){
A[++indexA]='[';
}
if(str[j]==')'){
if(A[indexA]=='(')indexA--;
else break;
}
if(str[j]==']'){
if(A[indexA]=='[')indexA--;
else break;
}
j++;
}

if(indexA<0)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
delete []str;
delete []A;
//system("pause");
return 0;
}


提交结果,他说是wrong answer
...全文
182 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
apple_v1 2016-03-16
  • 打赏
  • 举报
回复
要严格按照题目的要求去做,该判断的要判断。有没有什么特殊的情况没有考虑到?比如说N如果小于0或大于100,程序就会返回错误,而不能继续运算。S的长度大于10000会怎样?S为空串会怎样?S中包含其他字符又会怎样?算法还可以再优化吗?这些都是要认真考虑的,而不能只想到你认为对的结果,如果服务器测试一个特别的数据你的程序就挂了,这就是程序的健壮性。
shnaying1945 2016-03-14
  • 打赏
  • 举报
回复
我的程序并不复杂,刚开始就检查一下输入,如果长度为奇数,那肯定不匹配,直接NO了。 后面的,我只是用数组来替代堆栈。如果遇到左括号,那就追加到数组里面,遇到右括号,那就比较数组的最末位的左括号是不是匹配,匹配的话,数组index就左移一位。检查到最后,如果数组的index为负值,那就是完全匹配了。 输入多组数据验证,结果是对的,但提交给服务器验证,他说我的结果是错的。
shnaying1945 2016-03-14
  • 打赏
  • 举报
回复
引用 1 楼 apple_v1 的回复:
你写的程序很乱,这是我写的,你参考一下 #include<stdio.h> #include<stdlib.h> #define MAXLENGTH 5000 struct _del_type{ int top; char data[MAXLENGTH]; }; int push(struct _del_type *s,char c) /*入栈*/ { if(s->top>MAXLENGTH-1) return -1; s->data[s->top++]=c; return 0; } int pop(struct _del_type *s) /*出栈*/ { if(s->top<0) return -1; s->top--; return 0; } char top(struct _del_type s) /*返回栈顶元素*/ { if(s.top<0) return -1; return s.data[s.top-1]; } void ismatch(char *); main() { int n; scanf("%d",&n); if(n<=0||n>100) exit(1); char *p=malloc(2*MAXLENGTH); while(n-->0){ scanf("%s",p); ismatch(p); } free(p); } void ismatch(char *p) { struct _del_type d_s; d_s.top=0; while(*p!='\0'){ if(*p!='[' && *p!='(' && *p!=']' && *p != ')') return; if(*p=='[') push(&d_s,*p); else if(*p=='(') push(&d_s,*p); else if(*p==']') if(top(d_s)=='[') pop(&d_s); else{ printf("no\n"); return; } else if(*p==')') if(top(d_s)=='(') pop(&d_s); else{ printf("no\n"); return; } p++; } if(d_s.top==0) /*如果左右括号数匹配*/ printf("yes\n"); else printf("no\n"); }
我刚开始也是用的堆栈,程序很清晰,但是结果超时,只能改写。CSDN的富文本编辑器怎么那么差,我没见过那么糟糕的文本编辑,而且好像这样很久了
赵4老师 2016-03-14
  • 打赏
  • 举报
回复
仅供参考:
#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);
}
apple_v1 2016-03-14
  • 打赏
  • 举报
回复
你写的程序很乱,这是我写的,你参考一下 #include<stdio.h> #include<stdlib.h> #define MAXLENGTH 5000 struct _del_type{ int top; char data[MAXLENGTH]; }; int push(struct _del_type *s,char c) /*入栈*/ { if(s->top>MAXLENGTH-1) return -1; s->data[s->top++]=c; return 0; } int pop(struct _del_type *s) /*出栈*/ { if(s->top<0) return -1; s->top--; return 0; } char top(struct _del_type s) /*返回栈顶元素*/ { if(s.top<0) return -1; return s.data[s.top-1]; } void ismatch(char *); main() { int n; scanf("%d",&n); if(n<=0||n>100) exit(1); char *p=malloc(2*MAXLENGTH); while(n-->0){ scanf("%s",p); ismatch(p); } free(p); } void ismatch(char *p) { struct _del_type d_s; d_s.top=0; while(*p!='\0'){ if(*p!='[' && *p!='(' && *p!=']' && *p != ')') return; if(*p=='[') push(&d_s,*p); else if(*p=='(') push(&d_s,*p); else if(*p==']') if(top(d_s)=='[') pop(&d_s); else{ printf("no\n"); return; } else if(*p==')') if(top(d_s)=='(') pop(&d_s); else{ printf("no\n"); return; } p++; } if(d_s.top==0) /*如果左右括号数匹配*/ printf("yes\n"); else printf("no\n"); }

64,680

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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