1. 程式人生 > >3.2.2 括號匹配的實驗

3.2.2 括號匹配的實驗

這是書上括號匹配的實驗,主要運用棧實現,演算法理解非常簡單,但是實現過程中還是出現了許多問題:

  • 棧的基本函式不紮實,
    • 沒有初始化函式,初始化函式後沒有分配空間,使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; }