資料結構-棧在括號匹配中的應用
阿新 • • 發佈:2019-02-17
所謂括號校驗匹配其實質是對多種型別括號正確配對的校驗(包括:()、[]、{})即([])或者[()]為正確的表示式,如果出現交叉則匹配失敗,如[(])或([())則為不正確格式。
該程式也運用了棧的思想。若是左括號則入棧,若是右括號則看是否和當前棧頂元素是否匹配。若是則出棧,不是則當前表示式括號不匹配。
程式思想:
1.初始設定一個空棧,順序讀入括號。
2.若是右括號,則使置於棧頂的元素出棧與之匹配,若是括號序列不匹配,則退出程式
3.若是左括號,則將元素壓入棧中,演算法結束時,棧為空,否則括號序列不匹配
以下為示例程式碼:
//棧應用之校驗括號的匹配 #include "stdafx.h" #include "string.h" #define ElementType char #define MaxSize 10 //定義結構體 typedef struct { ElementType data[MaxSize];//資料域 int top;//棧頂指標 int size;//棧當前容量 }SqStack; /* 初始化棧 */ void InitStack(SqStack &s) { s.top = -1; s.size = 0; } /* 判斷棧是否為空 */ bool StackEmpty(SqStack s) { if (s.size == 0) { return true; } return false; } /* 入棧 */ bool PushStack(SqStack &s,ElementType e) { //if(s.top==MaxSize-1) if (s.size == MaxSize) { //棧滿 return false; } s.top++; s.data[s.top] == e; s.size++; return true; } /* 出棧 */ ElementType PopStack(SqStack &s) { //if(s.top==-1) if (s.size==0) { //棧空 return NULL; } ElementType e = s.data[s.top]; s.top--; s.size--; return e; } /* 校驗括號是否匹配 */ bool CheckMatch(char *str) { SqStack stack; InitStack(stack); int len = strlen(str); for (int i = 0; i < len; i++) { char x = str[i]; ElementType e; switch (x) { case '(': PushStack(stack, x); break; case '[': PushStack(stack, x); break; case '{': PushStack(stack, x); break; case ')': e = PopStack(stack); if (e != '(') { return false; } break; case ']': e = PopStack(stack); if (e != '[') { return false; } break; case '}': e = PopStack(stack); if (e != '{') { return false; } break; } } bool b = StackEmpty(stack); if (b) { return true; } return false; } void main() { char str[] = "[({})]"; bool b = CheckMatch(str); if (b) { printf_s("匹配成功"); } else { printf_s("匹配失敗"); } }