标题:帮忙找一下,程序出错原因。问题:编写程序,判断给定字符序列中(与),【 ...
只看楼主
阿维
Rank: 2
来 自:china
等 级:论坛游民
帖 子:30
专家分:43
注 册:2014-11-10
结帖率:100%
已结贴  问题点数:20 回复次数:9 
帮忙找一下,程序出错原因。问题:编写程序,判断给定字符序列中(与),【与】,{与}是否配对
#include <stdio.h>
#define  n 100
int search (char str[n],char key){
    int m,t=0;
    for(m=0;m<=str&&[m]!='\0';m++){
        if(str[m]==key)
            t=t+1;
    }
    return(t);
}
void main(){
    int a,b,c,d,e,f,i;
    char key,str[n];
    printf("please intput ");
    scanf("%s",str);
    key='(';
    a=search(str,key);
    key=')';
    b=search(str,key);
    key='[';
    c=search(str,key);
        key=']';
    d=search(str,key);
    key='{';
    e=search(str,key);
    key='}';
    f=search(str,key);
    if(a==b)
        printf("'('和')'匹配\n");
    else
        printf("'('和')'不匹配\n");
       if(c==d)
        printf("'['和']'匹配\n");
    else
        printf("'['和']'不匹配\n");
    if(e==f)
        printf("'{'和'}'匹配\n");
    else
        printf("'{'和'}'不匹配\n");
}
搜索更多相关主题的帖子: search include 编写程序 please return 
2014-11-20 17:32
阿维
Rank: 2
来 自:china
等 级:论坛游民
帖 子:30
专家分:43
注 册:2014-11-10
得分:0 
回复 楼主 阿维
顺便能不能试着加几条代码,使他还可以判断符号是否相交
2014-11-20 19:49
yahwei
Rank: 7Rank: 7Rank: 7
来 自:湖~
等 级:黑侠
威 望:3
帖 子:145
专家分:644
注 册:2011-11-10
得分:0 
程序代码:
#include <stdio.h>
#define  n 100
int search (char str[n],char key){
    int m,t=0;
    /*
    **只修改了这一句
    */
    for(m=0;str[m]!='\0';m++){
        if(str[m]==key)
            t=t+1;
    }
    return(t);
}
void main(){
    int a,b,c,d,e,f,i;
    char key,str[n];
    printf("please intput ");
    scanf("%s",str);
    key='(';
    a=search(str,key);
    key=')';
    b=search(str,key);
    key='[';
    c=search(str,key);
        key=']';
    d=search(str,key);
    key='{';
    e=search(str,key);
    key='}';
    f=search(str,key);
    if(a==b)
        printf("'('和')'匹配\n");
    else
        printf("'('和')'不匹配\n");
       if(c==d)
        printf("'['和']'匹配\n");
    else
        printf("'['和']'不匹配\n");
    if(e==f)
        printf("'{'和'}'匹配\n");
    else
        printf("'{'和'}'不匹配\n");
}

[qq]949654600[/qq]
2014-11-20 21:39
阿维
Rank: 2
来 自:china
等 级:论坛游民
帖 子:30
专家分:43
注 册:2014-11-10
得分:0 
nice,thank you.为什么这么改啊?两者有什么区别吗?
为什么这样一个稍稍的改动会产生质的变化。
2014-11-20 22:09
阿维
Rank: 2
来 自:china
等 级:论坛游民
帖 子:30
专家分:43
注 册:2014-11-10
得分:0 
回复 3 楼 yahwei
nice,thank you.为什么这么改啊?两者有什么区别吗?
 为什么这样一个稍稍的改动会产生质的变化。 求详细讲解啊。
另外可以试着改一下代码
让他同时可以判断符号是否相交吗
2014-11-20 22:12
yahwei
Rank: 7Rank: 7Rank: 7
来 自:湖~
等 级:黑侠
威 望:3
帖 子:145
专家分:644
注 册:2011-11-10
得分:7 
以下是引用阿维在2014-11-20 22:12:24的发言:

nice,thank you.为什么这么改啊?两者有什么区别吗?
 为什么这样一个稍稍的改动会产生质的变化。 求详细讲解啊。
另外可以试着改一下代码
让他同时可以判断符号是否相交吗

第一个问题是语法问题,语法是规定好的,没有为什么,所以没法详细讲解。
第二个问题代码如下:
程序代码:
#include <stdio.h>
#define  N 256
/*
**定义结构体,count保存符号数量,state保存左符号的最大位置或右符号的最小位置
**如果左符号的最大位置小于左符号的最小位置,那么两个符号不相交
**反之,必然会相交
*/
struct {
    char key ;
    int count ;
    int state ;
}
left[]  = { '(', 0, 0 ,    '[', 0, 0 ,    '{', 0, 0 },
right[] = {    ')', 0, 0 ,    ']', 0, 0 ,    '}', 0, 0 };

int 
main ( void ) {
    int i, j ;
    char str[N] ;
    printf ( "please intput:" ) ;
    scanf ( "%s", str ) ;
    /*
    **sizeof ( left ) / sizeof ( left[0] )这个表达式用来求数组的元素个数
    **这里就是左符号或左符号的个数(两者相等,求哪一个都一样)
    */
    for ( j = 0; j < sizeof ( left ) / sizeof ( left[0] ); j++ ) {
        /*
        **先从前往后判断左符号的个数,并记录左符号的最大位置
        */
        for ( i = 0; str[i] != '\0'; i++ ) {
            if ( str[i] == left[j].key ) {
                left[j].count++ ;
                left[j].state = i ;
            }
        }
        /*
        **再从后往前判断右符号的个数,并记录右符号的最小位置
        */
        while ( --i >= 0 ) {
            if ( str[i] == right[j].key ) {
                right[j].count++ ;
                right[j].state = i ;
            }
        }
        /*
        **判断左右符号是否匹配以及是否相交
        */
        if ( left[j].count == right[j].count ) {
            if ( left[j].state < right[j].state ) {
                printf ( "'%c'和'%c'匹配而不相交。\n", left[j].key, right[j].key ) ;
            }
            else {
                printf ( "'%c'和'%c'匹配且相交。\n", left[j].key, right[j].key ) ;
            }
        }
        else {
            printf ( "'%c'和'%c'不匹配。\n", left[j].key, right[j].key ) ;
        }
    }
    return 0 ;
}

[qq]949654600[/qq]
2014-11-22 10:40
soulmate1023
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:256
专家分:831
注 册:2014-9-23
得分:5 
为什么不用栈来做呢?我写了代码,你参考参考,大牛也来挑挑刺
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct snode{
        char data;
        struct snode *next;
        }snode;
typedef struct {
        snode *base;
        snode *sp;
        }stack;      


stack *init_stack(){
    stack *p;
    p=(stack *)malloc(sizeof(stack));
    if(!p) {printf("error!\n");exit(1);} 

    p->base=(snode *)malloc(sizeof(snode));
    if(!p->base) {printf("error!\n");exit(1);} 

    p->sp=(snode *)malloc(sizeof(snode));
    if(!p->sp) {printf("error!\n");exit(1);} 

    p->base->next=NULL;
    p->sp=p->base;
    return p;
}
int empty_stack(stack *p){
    if(p->base->next==NULL)
     return 0;
     else

     return 1;
     }
   

void push(stack *&p,char c){

   snode *q;
   q=(snode *)malloc(sizeof(snode));
   if(!q) {printf("error!\n");exit(1);}

   q->data=c;
   q->next=NULL;
   p->sp->next=q;
   p->sp=q;
}

char pop(stack *&p){
   if(!empty_stack(p)) {printf("empty stack\n");exit(1);}    

    char c;
    c=p->sp->data;
    snode *k;
    k=p->base;
    while(k->next!=p->sp)
      k=k->next;
      free(p->sp);
      p->sp=k;
      p->sp->next=NULL;
      return c;
}

char get_head(stack *p){
    if(!empty_stack(p)) {printf("empty stack\n");exit(1);}    

    char c;
    c=p->sp->data;
    return c;
}

int compare(char a1,char a2){  //>0 push, ==0pop  else no pipei
    if((a2-a1)==2||(a2-a1)==1) return 0;
    else if(a1=='{'&&(a2=='['||a2=='(')) return 1;
    else if(a1=='['&&a2=='(') return 1;
    else return -1;
}

int main(){
    char a[100];
    int i,k;
    printf("input the string\n");
    gets(a);
    k=strlen(a);
    stack *p;
    p=init_stack();
   for(i=0;i<k;i++){
    if(!empty_stack(p)) push(p,a[i]);
    else {
         char t;
         t=get_head(p);
         if(compare(t,a[i])>0)

            push(p,a[i]);
         else if(compare(t,a[i])==0)
              pop(p);
         else

           {  printf("不匹配!..");
              break;}
              }//else

              }//for
    if(i==k&&!empty_stack(p))
      printf("匹配成功!\n");
    else if(i<k)   ;
    else

        printf("不匹配!");
        free(p);
        system("pause");
        return 0;
        }   

2014-11-22 15:27
yahwei
Rank: 7Rank: 7Rank: 7
来 自:湖~
等 级:黑侠
威 望:3
帖 子:145
专家分:644
注 册:2011-11-10
得分:5 
以下是引用soulmate1023在2014-11-22 15:27:25的发言:

为什么不用栈来做呢?我写了代码,你参考参考,大牛也来挑挑刺
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct snode{
        char data;
        struct snode *next;
        }snode;
typedef struct {
        snode *base;
        snode *sp;
        }stack;      


stack *init_stack(){
    stack *p;
    p=(stack *)malloc(sizeof(stack));
    if(!p) {printf("error!\n");exit(1);}

    p->base=(snode *)malloc(sizeof(snode));
    if(!p->base) {printf("error!\n");exit(1);}

    p->sp=(snode *)malloc(sizeof(snode));
    if(!p->sp) {printf("error!\n");exit(1);}

    p->base->next=NULL;
    /*
    **    这里没有对p->sp保存就让它指向了p->base
    */
    p->sp=p->base;
    return p;
}
int empty_stack(stack *p){
    if(p->base->next==NULL)
     return 0;
     else

     return 1;
     }
   

void push(stack *&p,char c){

   snode *q;
   q=(snode *)malloc(sizeof(snode));
   if(!q) {printf("error!\n");exit(1);}

   q->data=c;
   q->next=NULL;
   p->sp->next=q;
   p->sp=q;
}

char pop(stack *&p){
   if(!empty_stack(p)) {printf("empty stack\n");exit(1);}   

    char c;
    c=p->sp->data;
    snode *k;
    k=p->base;
    while(k->next!=p->sp)
      k=k->next;
      free(p->sp);
      p->sp=k;
      p->sp->next=NULL;
      return c;
}

char get_head(stack *p){
    if(!empty_stack(p)) {printf("empty stack\n");exit(1);}   

    char c;
    c=p->sp->data;
    return c;
}

int compare(char a1,char a2){  //>0 push, ==0pop  else no pipei
    if((a2-a1)==2||(a2-a1)==1) return 0;
    else if(a1=='{'&&(a2=='['||a2=='(')) return 1;
    else if(a1=='['&&a2=='(') return 1;
    else return -1;
}

int main(){
    char a[100];
    int i,k;
    printf("input the string\n");
    gets(a);
    k=strlen(a);
    stack *p;
    p=init_stack();
   for(i=0;i<k;i++){
    /*
    **    好像没有规定字符串必须全部由“()、[]、{}”组成吧,其它字符应该过滤呀
    */
    if(!empty_stack(p)) push(p,a);
    else {
         char t;
         t=get_head(p);
         if(compare(t,a)>0)

            push(p,a);
         else if(compare(t,a)==0)
              pop(p);
         else

           {  printf("不匹配!..");
              break;}
              }//else

              }//for
    if(i==k&&!empty_stack(p))
      printf("匹配成功!\n");
    else if(i<k)   ;
    else

        printf("不匹配!");
        /*
        **    这里还没有检查栈是否为空就直接释放了头节点,好像有点不妥吧
        */
        free(p);
        system("pause");
        return 0;
        }   

本人小菜一个,代码里的注释就是我看完你的代码之后的拙见,如有错误请谅解。

[ 本帖最后由 yahwei 于 2014-11-22 17:08 编辑 ]

[qq]949654600[/qq]
2014-11-22 17:06
soulmate1023
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:256
专家分:831
注 册:2014-9-23
得分:3 
回复 8 楼 yahwei
首先,很感谢你看我的代码,我的代码太粗糙,感谢纠错;
1.我没理解你说的,为什么要保存p->sp,他不就是最初指向头结点就欧了?
2.嗯,我的代码不完整,最初是考虑来着,写完代码就忘了加上过滤了,不好意思啦
3.既然走到free(p);那一步,就肯定是屏幕已经输出是否匹配的信息了,所以不管栈里是否为空都可以释放了。
我的见解了,也不知道对不对。
2014-11-22 18:39
yahwei
Rank: 7Rank: 7Rank: 7
来 自:湖~
等 级:黑侠
威 望:3
帖 子:145
专家分:644
注 册:2011-11-10
得分:0 
回复 9 楼 soulmate1023
1、如果只是指向头结点,那就不需要为它申请空间。如果不保存,就又指向一个新的空间,那原来的空间不就是丢失了么?当然,在这段代码来说这个BUG是不影响最终的结果的。

3、代码容错性好不好,不能简单得认为它会按照你预想的流程执行,所以我觉得在释放头结点之前,加一个判断栈是否为空要好一点。只是加一句代码而已(if(!empty(p))),可是代码却健壮了许多。当然,这仅仅是我的编码习惯。

[ 本帖最后由 yahwei 于 2014-11-23 15:15 编辑 ]

[qq]949654600[/qq]
2014-11-23 15:14



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-438921-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029623 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved