| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 353 人关注过本帖
标题:栈检验括号序列,用文件
只看楼主 加入收藏
jumpyoung
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-11-24
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:4 
栈检验括号序列,用文件
请帮我改代码,不要只说大概,为什么打开内容为“{[()[()]]”的“xxx.txt”文件,程序显示“括号不匹配!”,应该为“缺乏右括号啊”
程序代码:
#define INITSTACKSIZE 50
#define INCREMENT 10
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
typedef struct
{
    char *top;
    char *base;
    int stacksize;
}Stack;
void Push(Stack &s,char c)
{
    if((s.top-s.base)>=s.stacksize)
        s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char));
    if(!s.base)
        exit(0);
    s.top=s.base+s.stacksize;
    s.stacksize+=INCREMENT;
    *s.top++=c;
}
void Pop(Stack &s,char &c)
{
    if(s.top==s.base)
        exit(0);
    c=*--s.top;
}
int StackEmpty(Stack s)
{
    if(s.top==s.base)
        return 1;
    else
        return 0;
}
void InitStack(Stack &a)
{
    a.base=(char*)malloc(INITSTACKSIZE*sizeof(char));
    if(!a.base)
    {
        printf("分配空间失败!\n");
        exit(-1);
    }
    a.top=a.base;
    a.stacksize=INITSTACKSIZE;
}
int main()
{   
    FILE *fp;
    Stack s;
    char a[100],b[100],e;
    char *p;
    printf("请输入您要读取的文件名:\n");
    gets(a);
    fp=fopen(a,"r");
    if(fp==NULL)
    {
        printf("打开文件失败!\n");
        exit(0);
    }
    else
    {
        printf("文件打开成功!\n");
    }
        fscanf(fp,"%s",b);
    fclose(fp);
puts(b);
    InitStack(s);
    p=b;

 while(*p) // 没到串尾
     switch(*p)
     {
       case '(':
       case '[':
       case '{':Push(s,*p++); // 左括号入栈,且p++
                break;
       case ')':
       case ']':
       case '}':if(!StackEmpty(s)) // 栈不空
                {
                  Pop(s,e); // 弹出栈顶元素
                  if(!(e=='('&&*p==')'||e=='['&&*p==']'||e=='{'&&*p=='}'))
                  { // 出现3种匹配情况之外的情况
                    printf("左右括号不配对\n");
                    exit(0);
                  }
                }
                else // 栈空
                {
                  printf("缺乏左括号\n");
                  exit(0);
                }
       default: p++; // 其它字符不处理,指针向后移
     }
   if(StackEmpty(s)) // 字符串结束时栈空
     printf("括号匹配\n");
   else
     printf("缺乏右括号\n");
    
    return 0;
}

2013-12-13 13:49
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:7 
请帮我改代码,不要只说大概
意思是把代码改好了给你就完事了呗?

总有那身价贱的人给作业贴回复完整的代码
2013-12-13 13:53
jumpyoung
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-11-24
收藏
得分:0 
回复 2楼 embed_xuel
请赐教,指出哪句代码出错啦,因为编译连接都没错,我都试了一上午,再想我头都大啦!
2013-12-13 13:57
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:7 
怎么搞得这么复杂呀,竟然要定义“栈”,直接分配一个和原字符串等长的字符串作栈空间就行了呀
甚至,如果不考虑效率的话,连内存分配都不要
2013-12-13 15:26
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:7 
Push函数写的不对。重写。

重剑无锋,大巧不工
2013-12-13 19:32
快速回复:栈检验括号序列,用文件
数据加载中...
 
   



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

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