当前位置: 代码迷 >> C语言 >> 求助!括号匹配问题!
  详细解决方案

求助!括号匹配问题!

热度:619   发布时间:2006-03-23 23:18:00.0
求助!括号匹配问题!

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

#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;
}

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

搜索更多相关的解决方案: 括号  

----------------解决方案--------------------------------------------------------

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;
}
}


----------------解决方案--------------------------------------------------------

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

#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;
}


----------------解决方案--------------------------------------------------------
高手
----------------解决方案--------------------------------------------------------
  相关解决方案