| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 274 人关注过本帖
标题:[括号匹配]求大神改错
只看楼主 加入收藏
xiaoyaojian
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-11-8
结帖率:0
收藏
已结贴  问题点数:20 回复次数:2 
[括号匹配]求大神改错
这个括号匹配的链栈实现程序,整体程序有一些不完整的地方但不影响主体的功能(主要是输出结果时还没调整好)
但是在目前这个状况下运行,会出现类似“{[ ]}”这样右括号两次出现但是程序停止运行的情况(实际应该是符合规定的输入)
初步估计是在pop函数和指针使用上有问题,但是解决不了,程序在vc6.0上是可以跑的,
求大神指导!!!!!!!!!!!

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct Stack
{
    char data;
    struct Stack *link;
}LNStack;

void InitStack(LNStack *top)
{
    LNStack *p;
    p=(LNStack*)malloc(sizeof(LNStack));
    p->link=NULL;
}


LNStack *Push(LNStack *top,char x)
{   
    LNStack *p;
    p=(LNStack *)malloc(sizeof(LNStack));
    p->data=x;
    p->link=top;
    top=p;
    return(p);
}

LNStack *Pop(LNStack *top)
{
    LNStack *p;
    if(top!=NULL)
    {   
        p=top;
        top=p->link;
        free(p);
    }
    p=top;
    return(p);
}

char Gettop(LNStack *top)
{
    char x;
    x=top->data;
    return x;
}


void Check(LNStack *top,char str[])
{   
    LNStack *q;
    char ch;
    int i=0;
    int state=1;
    q=(LNStack*)malloc(sizeof(LNStack));
    while(state&&(i<strlen(str)))
    {
        switch(str[i])
        {
        case'(':
        case'[':
        case'{':
            {
                q=Push(top,str[i]);
                printf("%c入栈\n",str[i]);
                i=i++;
                break;
            }
        case')':
            {
                ch=Gettop(q);
                printf("%c\n",ch);
                if(ch=='(')
                {
                    q=Pop(top);
                    printf("因为读取到‘)’,故上一个‘(’出栈\n");
                    i++;
                    state=1;
                    break;
                }
                else
                    printf("匹配错误,多出‘)’\n");
                    i++;
                    state=0;
                break;
            }
        case']':
            {
                ch=Gettop(q);
            if(ch=='[')
            {
                q=Pop(top);
                printf("因为读取到‘]’,故上一个‘[’出栈\n");
                i++;
                state=1;
                break;
            }
            else
                printf("匹配错误,多出‘]’\n");
                i++;
                state=0;
            break;
            }
        case'}':
            {
                ch=Gettop(q);
                if(ch=='{')
                {
                    q=Pop(top);
                    printf("因为读取到‘}’,故上一个‘{’出栈\n");
                    i++;
                    state=1;
                    break;
                }
                else
                    printf("匹配错误,多出‘}’\n");
                    i++;
                    state=0;
                break;
            }
        default:i++;
        }
    }
    ch=Gettop(top);
    if(ch!=NULL)
        printf("匹配错误,多出左括号\n");//单只有左边括号也是不合法的
}

void main()
{
    LNStack *top;
    char str[20];
    top=(LNStack*)malloc(sizeof(LNStack));
    top->link=NULL;
    printf("请输入字符串:");
    scanf("%s",str);
    Check(top,str);
}
搜索更多相关主题的帖子: include 影响 
2012-11-09 00:26
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:10 
太长 了~~

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2012-11-09 12:38
woxingx
Rank: 2
等 级:论坛游民
帖 子:46
专家分:68
注 册:2012-11-8
收藏
得分:10 
其实不用那么长的利用case语句就好了,没那么复杂
2012-11-09 13:34
快速回复:[括号匹配]求大神改错
数据加载中...
 
   



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

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