| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4664 人关注过本帖
标题:数据结构括号匹配问题
只看楼主 加入收藏
星野
Rank: 2
来 自:河北
等 级:论坛游民
帖 子:73
专家分:26
注 册:2016-4-13
结帖率:82.35%
收藏
已结贴  问题点数:20 回复次数:5 
数据结构括号匹配问题
程序代码:
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 5

#define OK 1
#define ERROR 0
typedef char ElemType;
typedef struct { /*建立一个栈的首结点*/
    ElemType * base;
    ElemType * top;
    int stacksize;
} SqStack;
int InitStack(SqStack *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(SqStack *s) { /*判断栈是否为空*/
    if (s->top==s->base) return OK;
    else                 return ERROR;
}
int Push(SqStack *s,ElemType e) { /*往栈顶插入元素即进栈*/
    if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/
        s->base=((ElemType*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(ElemType)));
        if (!s->base) return ERROR;
        s->stacksize+=STACKINCREMENT;
        s->top=s->base+s->stacksize;
    }
    *s->top++=e;
    return OK;
}
int Pop(SqStack *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(SqStack *s) {                                    //这一小段是什么意思啊 为什么STACK_INIT_SIZE得*2啊,后面又定义e1是干嘛?
    ElemType e[STACK_INIT_SIZE*2];
    ElemType e1;
    int i;

 
    InitStack(s);
    fgets(e,STACK_INIT_SIZE*2,stdin);                     fgets这个函数有什么用?这一段也看不懂
    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() {
    SqStack s;
    Count(&s);
    free(s.base);
}
2016-10-09 17:36
星野
Rank: 2
来 自:河北
等 级:论坛游民
帖 子:73
专家分:26
注 册:2016-4-13
收藏
得分:0 
回复 楼主 星野
这是在百度上看别人的代码   有很多都读不懂!
2016-10-09 17:36
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:20 
fgets(e,STACK_INIT_SIZE*2,stdin);                     fgets这个函数有什么用?这一段也看不懂
fgets是个文件读写的读函数,stdin是“屏幕”,所以这里这里相当于 scanf("%s",&e);//不过fgets又限制了读入的字符串长度不能大于STACK_INIT_SIZE*2

至于为什么要乘以2,,那是因为这个程序最多允许读STACK_INIT_SIZE-1组左右括号,左括号一个右括号一个,加起来就得两倍空间了。。

---------------------
我觉得看别人代码头疼得很,,但这样的学习方式确实不错。唯一的问题就是光读代码是不能学会编程的。我建议你多多刷题。像这段代码就是在联系堆栈的使用。如果你自己已经会写了,那么回过头来看这段代码就轻松的多了。
我本人去年在Mooc中国大学 跟了陈越姥姥的《数据结构》课程,也是大量刷题,感觉提高比读代码来着快而有效的多

读代码,要么是在读算法,要么就是在读编程规范。而这段代码其实就是“堆栈”的一个应用实例。技巧应该算不上吧

φ(゜▽゜*)♪
2016-10-10 13:41
星野
Rank: 2
来 自:河北
等 级:论坛游民
帖 子:73
专家分:26
注 册:2016-4-13
收藏
得分:0 
回复 3楼 书生牛犊
   好吧   其实我也很迷茫  不知道该怎么学  在网上听了好多视频课  然后自己尝试写代码  但是好多还是不太会  很多东西都需要别人指点    感觉程序之路好烦啊   看着同学他们都做着自己喜欢做的事都很有成果  而我天天打着码什么也弄不了心里也是及其郁闷的   
2016-10-10 17:30
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 4楼 星野
去网易云课堂跟一轮浙大陈越姥姥的《数据结构》吧!
然后就疯狂刷题去吧。
我就这么过来的。当然,我现在水平也还很浅。
--------
不过你说你已经看过很多视频了。那可能不用跟《数据结构》了,直接去找地方刷题把。只要是大一点的平台都可以。
我推荐《数据结构》主要是因为浙大联合几家公司搞了一个刷题平台,而这个课程正好适合平台上的一些算法题相对应的。每一周的课程都会有对应的练习题,供你锻炼。每周老师也会抽一两道有代表性的题目拿出来解说。
在我看来,非常受用。

φ(゜▽゜*)♪
2016-10-10 20:15
星野
Rank: 2
来 自:河北
等 级:论坛游民
帖 子:73
专家分:26
注 册:2016-4-13
收藏
得分:0 
回复 5楼 书生牛犊
en   我已经看了你说的 陈越的数据结构了  接下来的我会更努力的  谢谢你
2016-10-10 22:00
快速回复:数据结构括号匹配问题
数据加载中...
 
   



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

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