这是书上括号匹配的实验,主要运用栈实现,算法理解非常简单,但是实现过程中还是出现了许多问题:
- 栈的基本函数不扎实,
- 没有初始化函数,初始化函数后没有分配空间,使top指向了未知的区域
- 又一次没有加&符号
- realloc的用法记不清楚!
- ‘=’赋值反了,许多次出现了这个错误
下面贴下代码:
#include<stdio.h>
#include<stdlib.h>
#define Stack_Init_Size 100
#define StackImplement 10
#define OVERFLOW -2
//括号匹配
// 1.定义栈结构
// 2.栈的初始化
// 3.入栈函数
// 4.栈空判断函数
// 5.出栈函数
// 6.括号匹配函数:从第一个括号开始读,左括号即压入栈内;右括号即取出栈顶元素,检测是否配对,如果栈空或者不能配对,即括号匹配失败
// 7.main函数
typedef struct{
char *top,*base;
int stacksize;
}SqStack;
void CreateStack(SqStack &S)
{
S.base=(char *)malloc(Stack_Init_Size*sizeof(char));//没有分配初始空间,使得top指向了未知区域
if(!S.base)
exit(OVERFLOW);
S.top=S.base;
S.stacksize=Stack_Init_Size;
}
void Push(SqStack &S,char e)//缺失了&的符号,无法改变
{
if(S.top-S.base>=S.stacksize)
{
S.base=(char *)realloc(S.base,(S.stacksize+StackImplement)*sizeof(char));//记realloc用法
if(!S.base)
exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=StackImplement;
}
*S.top++=e;//这里又赋值赋反了
}
int EmptyStack(SqStack S)
{
if(S.top==S.base)
return 1;
return 0;
}
void Pop(SqStack &S,char e)
{
if(!EmptyStack(S))
e=*--S.top;
}
int match(char *a,int N)
{
int i;
char e;
SqStack S;
CreateStack(S);
for(i=0;i<N;i++)
{
if(a[i]=='('||a[i]=='[')
{
Push(S,a[i]);
continue;
}//这里的逻辑有点问题
else
if(a[i]==')'||a[i]==']')
{
if(EmptyStack(S))
return 0;
Pop(S,e);
if(a[i]==')'&&e=='(')
continue;
else
if(a[i]==']'&&e=='[')
continue;
else return 0;
}
}
}
int main()
{
char a[100];
int N,i;
scanf("%d",&N);
fflush(stdin);
gets(a);
if(match(a,N))
printf("Congratulations!\n");
else printf("Fail!\n");
return 0;
}