| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 728 人关注过本帖
标题:堆栈做了个检验括号是否匹配的程序,不知错哪 。 求指点错在哪里 语法可能 ...
只看楼主 加入收藏
进击的蛋炒饭
Rank: 1
等 级:新手上路
帖 子:14
专家分:8
注 册:2014-3-25
结帖率:33.33%
收藏
已结贴  问题点数:10 回复次数:10 
堆栈做了个检验括号是否匹配的程序,不知错哪 。 求指点错在哪里 语法可能有错
// 括号匹配.cpp : Defines the entry point for the console application.
//用堆栈的方式实现括号的配对问题

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100;  //存储空间初始分量为100
#define STACKINCREMENT 10;    //存储空间分配增量为10

typedef struct stack
{
    char *base;
    char *top;
    int stacksize;
}SqStack;

Status InitStack(SqStack &s)  //构造空栈
{
    s.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
    if(!s.base) exit (OVERFLOW);
    s.top = s.base;
    s.stacksize = STACK_INIT_SIZE;
    return OK;
}

Status GetTop(SqStack s,SElemTyop &e)   //判定栈是否为空,若空报错
{
    if(s.top == s.base)   return ERROR;
    e = *(s.top-1);
    return OK;
}

Status Push(SqStack &s,SElemtype e)               //压栈                                                         
{
    if(s.top -s.base >= s.stacksize)                                                                      // 栈满,加空间
    {
    s.base = (SElemType *)realloc(s.base,(s.stacksize +STACKINCREMENT) * sizeof(SElemtype));
    if(!s.base) exit (OVERFLOW);                                                                          //存储分配失败
    s.top = s.base+s.stacksize;
    s.stacksize += STACKINCREMENT;
    }
    *s.top++ = e;
    return OK;
}

Status Pop(SqStack &s,SElemtype &e)                 //出栈
{
    if(s.top =s.base) return ERROR;
    e = * --s.top;
    return OK;
}



Bool Brackets Correspondency(char a[])
{
    int i=0;
    stack s;
    Initstack(s);
    Elemtype x;
    printf("请输入带括号字符串:\n");
    scanf("%s",a[]);
    while(a[i])
    {
        switch(a[i])
        {
        case '(' : Push(s,a[i]); break;
        case '[' : Push(s,a[i]); break;
        case ')' : GetTop(s,x);
            if (x=='(') Pop(s,x);
            else return ERROR;break;
        case ']' : GetTop(s,x);
            if (x=='[') Pop(s,x);
            else return ERROR;break;
        default;
        }
        i++;
    }
    if(s.size !=0) return ERROR;
    return OK;
}

int main()
{
    Sqstack s;
    InitStack(s);
    if(Bool Brackets Correspondency(char a[]))
        printf("括号匹配\n");
    else
        printf("括号不匹配!\n");
    free(s.base);
    return 0;   
}

错误提示d:\工作学习\c\括号匹配\括号匹配.cpp(94) : fatal error C1010: unexpected end of file while looking for precompiled header directive
执行 cl.exe 时出错.
搜索更多相关主题的帖子: include 空间 
2014-05-13 22:37
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:4 
首先类型 Status、常量(或枚举植?)ERROR OK OVERFLOW 未定义。
2014-05-14 00:02
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
还有其它一些问题,如
Sqstack s; // 大小写不对
SElemtype 类型未定义。等等。
这可是楼主认真写的代码?
2014-05-14 00:12
进击的蛋炒饭
Rank: 1
等 级:新手上路
帖 子:14
专家分:8
注 册:2014-3-25
收藏
得分:0 
回复 3 楼 top398
// 括号匹配.cpp : Defines the entry point for the console application.
//用堆栈的方式实现括号的配对问题

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100       //存储空间初始分量为100
#define STACKINCREMENT 10         //存储空间分配增量为10
#define OVERFLOW -2
#define OK 1
#define ERROR 0

typedef struct stack
{
    char *base;
    char *top;
    int stacksize;
}SqStack;
char InitStack(SqStack &s);
char GetTop(SqStack s,char &e);
char Push(SqStack &s,char e);
char Pop(SqStack &s,char &e);

char InitStack(SqStack &s)  //构造空栈
{
    s.base = (char *)malloc(STACK_INIT_SIZE * sizeof(char));
    if(!s.base)     exit (OVERFLOW);
    s.top = s.base;
    s.stacksize = STACK_INIT_SIZE;
    return OK;
}

char GetTop(SqStack s,char &e)   //判定栈是否为空,若空报错
{
    if(s.top == s.base)   return ERROR;
    e = *(s.top-1);
    return OK;
}

char Push(SqStack &s,char e)               //压栈                                                         
{
    if(s.top -s.base >= s.stacksize)                                                                      // 栈满,加空间
    {
    s.base = (char *)realloc(s.base,(s.stacksize +STACKINCREMENT) * sizeof(char));
    if(!s.base) exit (OVERFLOW);                                                                          //存储分配失败
    s.top = s.base+s.stacksize;
    s.stacksize += STACKINCREMENT;
    }
    *s.top++ = e;
    return OK;
}

char Pop(SqStack &s,char &e)                 //出栈
{
    if(s.top =s.base) return ERROR;
    e = * --s.top;
    return OK;
}



bool BracketsCorrespondency(SqStack &s)
{
    char a[STACK_INIT_SIZE];
    int i=0;
    InitStack(s);
    char x;
    printf("请输入带括号字符串:\n");
    scanf("%s",a);
    while(a[i])
    {
        switch(a[i])
        {
        case '(' : Push(s,a[i]); break;
        case '[' : Push(s,a[i]); break;
        case ')' : GetTop(s,x);
            if (x=='(') Pop(s,x);
            else return ERROR;break;
        case ']' : GetTop(s,x);
            if (x=='[') Pop(s,x);
            else return ERROR;break;
        default:break ;
        }
        i++;
    }
    if(s.stacksize !=0) return ERROR;
    return OK;
}

int main()
{
    SqStack s;
    InitStack(s);
    if(BracketsCorrespondency(s))
        printf("括号匹配\n");
    else
        printf("括号不匹配!\n");
    return 0;   
}


是认真写的  ,不过本人较菜
自己重新改的,没有报错了,不过最后匹配的括号也显示不匹配
2014-05-14 00:16
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
BracketsCorrespondency 函数尾部:
    if(s.stacksize !=0) return ERROR;
判断条件不对,应为:
    if( (s.top - s.base) !=0) return ERROR;
2014-05-14 09:18
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
另外 Push Pop GetTop 几个函数既然返回 ERROR 或 OK,在调用后应该进行检查,否则也可能造成匹配错误。
2014-05-14 09:22
进击的蛋炒饭
Rank: 1
等 级:新手上路
帖 子:14
专家分:8
注 册:2014-3-25
收藏
得分:0 
回复 6 楼 top398
成了成了~多谢这位大哥,昨天晚上看到一点都没检查出来,救命了呀,这是期中的作业,可以交了~~
2014-05-14 10:18
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:4 
回复 7 楼 进击的蛋炒饭
代码不是一次就能写成的,出了问题也不是靠检查解决的,需要调试。

总有那身价贱的人给作业贴回复完整的代码
2014-05-14 10:27
进击的蛋炒饭
Rank: 1
等 级:新手上路
帖 子:14
专家分:8
注 册:2014-3-25
收藏
得分:0 
回复 8 楼 embed_xuel
这位大侠所言极是,我知道VC里有调试,但我不知道怎么操作,求指点一二
2014-05-14 10:43
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
回复 9 楼 进击的蛋炒饭
最笨的方法,用printf把怀疑的地方打印出来

总有那身价贱的人给作业贴回复完整的代码
2014-05-14 10:59
快速回复:堆栈做了个检验括号是否匹配的程序,不知错哪 。 求指点错在哪里 语法 ...
数据加载中...
 
   



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

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