标题:严蔚敏 吴伟明 数据结构 栈的基本操作实现 括号匹配
只看楼主
jaq1318707
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2010-4-21
 问题点数:0 回复次数:6 
严蔚敏 吴伟明 数据结构 栈的基本操作实现 括号匹配
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 2

typedef struct {
    int *base;
    int *top;
    int stacksize;
}sqstack;

void initstack(sqstack *s){
    s->base=(int *)malloc(sizeof(int)*STACK_INIT_SIZE);
    if(!s->base)  exit(0);
    s->top=s->base;
    s->stacksize=STACK_INIT_SIZE;
}

int stackempty(sqstack s){
    if(s.base==s.top) return 1;
    else return 0;
}

void gettop(sqstack s,int *e){
    if(s.top==s.base) return;
    *e=*(s.top-1);
}

void push(sqstack *s,int e){
    if(s->top-s->base>=s->stacksize){
        if(!(s->base=(int*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(int))))
        exit(-2);
        s->top=s->base+s->stacksize;
        s->stacksize+=STACKINCREMENT;
    }

    *s->top++=e;
}

void pop(sqstack *s,int *e){
    if(s->top==s->base) return;
    *e=*(--s->top);
}
void check(){
    sqstack s;
    char *p,ch[20],c;
    initstack(&s);
    gets(ch);
    p=ch;
    while(*p){
        switch(*p){
        case '(':
        case '[':
            push(&s,*p++);
            break;
        case ')':
        case ']':
            
            if(stackempty(s)){printf("error0\n");exit(0);}
            else {pop(&s,&c);
                if(*p==')'&&c!='('||*p=='['&&c!=']')
                {printf("error1\n");
                 exit(0);
                }
                else{
                    p++;
                    break;
                }
               
            }
        default:p++;
        }
    }
 if(stackempty(s))
     printf("success\n");
 else
     printf("failure\n");   
}

void main(){
    check();
}
搜索更多相关主题的帖子: 严蔚敏 数据结构 吴伟明 括号 
2010-05-14 11:47
新绿
Rank: 1
等 级:新手上路
帖 子:15
专家分:7
注 册:2010-4-26
得分:0 
void pop(sqstack *s,int *e)  -->void pop(sqstack *s,char *e)
2010-05-17 16:08
新绿
Rank: 1
等 级:新手上路
帖 子:15
专家分:7
注 册:2010-4-26
得分:0 
void gettop(sqstack s,int *e){
    if(s.top==s.base) return;
    *e=*s.top;
}
2010-05-17 16:21
新绿
Rank: 1
等 级:新手上路
帖 子:15
专家分:7
注 册:2010-4-26
得分:0 
void gettop(sqstack s,int *e){
    if(s.top==s.base) return ;
    *e=*s.top--;
}
2010-05-17 16:41
新绿
Rank: 1
等 级:新手上路
帖 子:15
专家分:7
注 册:2010-4-26
得分:0 
在这个判定程序中【】 与{}没有区别么?感觉结果虽然正确 还有很多地方很不规范,我总的修改如下:

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 2

typedef struct {
    int *base;
    int *top;
    int stacksize;
}sqstack;

void initstack(sqstack *s){
    s->base=(int *)malloc(sizeof(int)*STACK_INIT_SIZE);
    if(!s->base)  exit(0);
    s->top=s->base;
    s->stacksize=STACK_INIT_SIZE;
}

int stackempty(sqstack s){
    if(s.base==s.top) return 1;
    else return 0;
}

void gettop(sqstack s,int *e){
    if(s.top==s.base) return ;
    *e=*s.top--;
}

void push(sqstack *s,int e){
    if(s->top-s->base>=s->stacksize){
        if(!(s->base=(int*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(int))))
        exit(-2);
        s->top=s->base+s->stacksize;
        s->stacksize+=STACKINCREMENT;
    }

    *s->top++=e;
}

void pop(sqstack *s,char *e){
    if(s->top==s->base) return;
    *e=*(--s->top);
}
void check()
{
    sqstack s;
    char *p,ch[20],c;
    initstack(&s);
    gets(ch);
    p=ch;
    while(*p)
    {
        switch(*p)
        {
        case '(':
        case '[':
            push(&s,*p++);
            break;
        case ')':
        case ']':
            
            if(stackempty(s))
            {
                printf("error0\n");
                exit(0);
            }
            else
            {
                pop(&s,&c);
                if(*p=='('&&c!=')'||*p==']'&&c!='[')
                {
                    printf("error1\n");
                    exit(0);
                }
                else
                {
                    p++;
                    break;
                }
               
            }
        default:p++;
        }
    }
    if(stackempty(s))
     printf("success\n");
   else
     printf("failure\n");   
}

void main()
{
    check();
}
2010-05-17 16:56
jaq1318707
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2010-4-21
得分:0 
回复 5楼 新绿
1.自己要实现其他的括号匹配,只要在switch中加上即可。
2.要注意出栈与取栈顶元素的差别。
其中取栈顶元素时,栈顶指针不变,栈顶元素也不变
出栈时栈顶指针减1;
3.另外从char->int是自动转换的,没影响。
当然谢谢你的建议
2010-05-20 00:18
jaq1318707
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2010-4-21
得分:0 
注意top-1与top--的不同!!
2010-05-20 00:20



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




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

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