| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4702 人关注过本帖
标题:求助!括号匹配问题!
只看楼主 加入收藏
未来的梦
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2006-3-23
收藏
 问题点数:0 回复次数:3 
求助!括号匹配问题!

//括号匹配是否匹配
//如: ([]()) 或 [([][])]等为正确格式,[(]) 或 ([()) 或 (()]均为不正确格式

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define INIT_STACK_SIZE 80
#define STACKINCREMENT 10
#define MAX 50
typedef struct{
char *elem;
int top;
int stacksize;
}SqStack;
SqStack S; //将栈设置为全局变量

void Init(SqStack S);
int Process(SqStack S,char expression[],int len);
void Push(SqStack S,char e);
int Detect(SqStack S);
void Pop(SqStack S);

int main(void)
{
char expression[50];
int len;

printf("Please input string:");
scanf("%s",expression);
len=strlen(expression);
Init(S);
if(Process(S,expression,len)) //检测括号是否配对情况
printf("Success.\n");
else
printf("Failure.\n");

return 0;
}

void Init(SqStack S) //栈初始化
{
if((S.elem=(char *)malloc(INIT_STACK_SIZE * sizeof(char)))==NULL)
{
exit(1);
}
S.top=0;
S.stacksize=INIT_STACK_SIZE;
}

int Process(SqStack S,char expression[],int len)
{
int i,flag;

flag=1; //设置个标志
for(i=0;i<=len-1;i++)
{
switch(expression[i])
{
case '(': //如果是左侧括号就压入栈
Push(S,expression[i]);
break;
case '[':
Push(S,expression[i]);
break;
case '{':
Push(S,expression[i]);
break;
case ')': //Detect()的功能是检测栈是否为空
if(Detect(S) && (S.elem[S.top-1]=='('))
Pop(S); //Pop()的功能是栈顶元素出栈
else
{
flag=0;
return flag;
}
break;
case ']':
if(Detect(S) && (S.elem[S.top-1]=='['))
Pop(S);
else
{
flag=0;
return flag;
}
break;
case '}':
if(Detect(S) && (S.elem[S.top-1]=='{'))
Pop(S);
else
{
flag=0;
return flag;
}
break;
}//switch
}//for

return flag; //将标志的结果返回到main()
}

void Push(SqStack S,char e) //入栈
{
char *newbase;

S.elem[S.top++]=e;
if(S.top>=S.stacksize)
{
if((newbase=(char *)realloc(S.elem,(S.stacksize + STACKINCREMENT) * sizeof(char)))==NULL)
{
exit(1);
}
S.elem=newbase;
S.stacksize+=STACKINCREMENT;
}
}

int Detect(SqStack S) //检测栈是否为空函数
{
int flag=1;

if(S.top==0)
flag=0;

return flag;
}

void Pop(SqStack S) //Pop()功能是栈顶元素初栈
{
S.top=S.top-1;
}

以上程序为什么不能实现?

搜索更多相关主题的帖子: 括号 
2006-03-23 23:18
本人已死
Rank: 1
等 级:新手上路
威 望:1
帖 子:183
专家分:0
注 册:2005-9-20
收藏
得分:0 

void Push(SqStack S,char e) //入栈
{
char *newbase;

S.elem[S.top++]=e;//S.elem是char类型的指针,好像不能把变量e赋值给S.elem[]吧!小弟愚见:栈的结构有问题,用数组代替链表试试
if(S.top>=S.stacksize)
{
if((newbase=(char *)realloc(S.elem,(S.stacksize + STACKINCREMENT) * sizeof(char)))==NULL)
{
exit(1);
}
S.elem=newbase;
S.stacksize+=STACKINCREMENT;
}
}


爸爸告诉我:女人喜欢有钱的男人;妈妈告诉我:女人喜欢有貌的男人。我翻翻钱包,又照照镜子,然后我哭了
2006-03-24 15:06
success
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2006-3-24
收藏
得分:0 

我是新注册的,就看到你这个程序大,我看了看,你写那是什么啊?你那叫栈吗?栈是你那样吗?好好看看数据结构,看看我下面的:什么叫栈

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 100
#define INIT_STACK_SIZE 10
#define STACKINCREMENT 10
typedef struct{
char *base;
char *top;
int stacksize;
}SqStack;

SqStack InitStack(SqStack S);
int Process(SqStack S,char expression[],int len);
SqStack Push(SqStack S,char c);
int StackEmpty(SqStack S);
SqStack Pop(SqStack S);
void OutPut(SqStack S);

int main(void)
{
SqStack S;
char expression[MAX];
int len;

printf("Please input string: \n");
scanf("%s",expression);
len=strlen(expression);
S=InitStack(S); //初始化栈
if(Process(S,expression,len))
printf("success.\n");
else
printf("failure.\n");

return 0;
}

SqStack InitStack(SqStack S)
{
if((S.base=(char *)malloc(INIT_STACK_SIZE * sizeof(char)))==NULL)
{
exit(1);
}
S.top=S.base;
S.stacksize=INIT_STACK_SIZE;

return S;
}

int Process(SqStack S,char expression[],int len)
{
int i,flag=1;

for(i=0;i<=len-1;i++)
{
switch(expression[i])
{
case '(': //如果出现左括号就压入栈
S=Push(S,expression[i]);
break;
case '[':
S=Push(S,expression[i]);
break;
case '{':
S=Push(S,expression[i]);
break;
case ')':
if(StackEmpty(S) && *(S.top-1) == '(') //栈不空,且前一个元素是坐括号
S=Pop(S); //出栈
else
{
flag=0;
return flag;
}
break;
case ']':
if(StackEmpty(S) && *(S.top-1) == '[')
S=Pop(S);
else
{
flag=0;
return flag;
}
break;
case '}':
if(StackEmpty(S) && *(S.top-1) == '{')
S=Pop(S);
else
{
flag=0;
return flag;
}
break;
default:
flag=0;
return flag;
}//switch
}//for

if(S.top == S.base) //栈空
flag=1;
else
flag=0;

return flag;
}

SqStack Push(SqStack S,char c)
{
*(S.top++)=c;
if(S.top-S.base >= S.stacksize)
{
if((S.base=(char *)realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof(char)))==NULL)
{
exit(1);
}
S.top=S.base + S.stacksize;
S.stacksize+=STACKINCREMENT;
}

return S;
}

int StackEmpty(SqStack S)
{
int flag=1;

if(S.top == S.base)
flag=0;

return flag;
}

SqStack Pop(SqStack S)
{
S.top--;

return S;
}


2006-03-24 19:55
haishanglang
Rank: 1
等 级:新手上路
帖 子:378
专家分:0
注 册:2006-3-2
收藏
得分:0 
高手

2006-03-24 20:26
快速回复:求助!括号匹配问题!
数据加载中...
 
   



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

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