資料結構(C語言)讀書筆記6:棧的應用之括號匹配的C程式碼實現
阿新 • • 發佈:2018-12-30
括號匹配的演算法思想:
初始化一個空棧,掃描表示式,依次讀入字元,知道掃描完或者出現錯誤匹配。對於讀入的每個字元,分以下情況處理:
(1)、如果是‘’(“”或“【”,將其壓入棧。
(2)、如果是“)”,則根據當前棧頂元素的值分情況考慮。若棧頂元素是“(”,則匹配成功,否則為非法情況。
(3)、如果是“】”,則根據當前棧頂元素的值分情況考慮。若棧頂元素是“【”,則匹配成功,否則為非法情況。
——————————C程式碼——————VC++6.0編譯成功,成功執行—————————————————
#include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef int Status; typedef char SElemType; #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW -1 #define STACK_INNT_SIZE 100//儲存空間初始分配量 #define STACKINCREMENT 10//儲存空間分配增量 typedef struct { SElemType *base; SElemType *top; int stacksize; }SqStack; Status InitStack(SqStack &S) { S.base= (SElemType *) malloc(STACK_INNT_SIZE * sizeof(SElemType) ) ; if(!S.base) exit(OVERFLOW); S.top=S.base; S.stacksize=STACK_INNT_SIZE; return OK; } Status DestoryStack(SqStack &S) { free(S.base); S.base=S.top=NULL; return OK; } Status ClearStack(SqStack &S) { S.top=S.base; return OK; } Status StackEmpty(SqStack S) { if(S.top==S.base) return TRUE; return FALSE; } Status Push(SqStack &S,SElemType e) { if(S.top-S.base>=S.stacksize) { S.base=(SElemType *)realloc(S.base,(S.stacksize + STACKINCREMENT)*sizeof(SElemType)); if(S.base==NULL) { printf("malloc failed.\n"); exit(OVERFLOW); } S.top=S.base+S.stacksize; S.stacksize += STACKINCREMENT; } *S.top++=e; return OK; } Status Pop(SqStack &S,SElemType &e) { if(S.top==S.base) return ERROR; e=*--S.top; return OK; } Status GetTop(SqStack S,SElemType &e) { if(S.top==S.base) return ERROR; e=*(S.top-1); return OK; } void Matching() { SqStack S; SElemType ch[80],*p,e; InitStack(S); printf("請輸入表示式:\n"); gets(ch); p=ch; while(*p) { switch(*p){ case '(': case '[': Push(S,*p++); break; case ')': case ']': if(!StackEmpty(S)) { Pop(S,e); if(*p==')'&& e!='('||*p=='['&& e!=']') { printf("左右括號不配對\n"); return; } else { p++; break; } } else { printf("缺少左括號\n"); return; } default:p++; } } if(StackEmpty(S)) printf("括號匹配.\n"); else printf("缺少右括號.\n"); } int main() { Matching(); system("pause"); return 0; }