3.2.2 括號匹配的實驗
阿新 • • 發佈:2019-01-28
這是書上括號匹配的實驗,主要運用棧實現,演算法理解非常簡單,但是實現過程中還是出現了許多問題:
- 棧的基本函式不紮實,
- 沒有初始化函式,初始化函式後沒有分配空間,使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;
}