1. 程式人生 > >棧的簡單應用-括號匹配

棧的簡單應用-括號匹配

  假設表示式中執行包含兩種括號:圓括號和方括號,其巢狀順序隨意,即

([]) 或 [([][])]等均為正確的格式。[(]) 或 ([()) 或 (())]均為不正確的格式。檢驗括號

匹配的方法可以用“期待的急迫程度”這個概念來描述

  分析可能出現不匹配的情況:

  (1)到來的右括弧不是所“期待”的;

  (2)到來的是“不速之客”(右括弧多了); 

  (3)直到結束也沒有到來所“期待”的(左括弧多了)。

  括號匹配的檢驗邏輯如下:

  (1)凡是出現左括弧,則進棧。

  (2)凡是出現右括弧,首先檢查棧是否為空;

    若棧空,則表明“右括弧”多了;

    否則和棧頂元素比較:

    若相匹配,則“左括弧出棧”;

    否則不匹配。

  (3)表示式檢驗結束時:

    若棧空,則匹配正確;

    否則表明“左括弧”多了。

  具體程式碼如下:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <math.h>
 4 #include "sqstack.h" //引入順序棧儲存結構及其基本操作
 5 #define OK 1
 6 #define ERROR 0
 7 void check(){
 8     //對於輸入的任意一個字串判斷其括號是否匹配
9 10 SqStack *s=(SqStack*)malloc(sizeof(SqStack)); 11 12 StackType str[100],*p=NULL,*e; 13 e = (StackType*)malloc(sizeof(StackType)); 14 if (InitStack(s) == OK) { 15 printf("請輸入表示式\n"); 16 gets(str); 17 p = str; 18 while (*p) //沒到串尾 19 switch
(*p) 20 { 21 case'(': 22 case'[': 23 Push(s, *p++); break;//左括號入棧 且p++ 24 case')': 25 case']': 26 if (EmptyStack(s) != OK) 27 {//棧不為空 28 Pop(s, e); //彈出棧頂元素 29 if(*p==')'&&*e!='('||*p=='['&&*e!=']') 30 //彈出的棧頂元素與*p不匹配 31 { 32 printf("左右括號不匹配\n"); 33 return; 34 } 35 else 36 { 37 p++; 38 break; 39 } 40 41 42 } 43 else //棧空 44 { 45 printf("缺乏左括號\n"); 46 return; 47 } 48 default: p++;//其他字元不處理,指標後移 49 } 50 if (EmptyStack(s) == OK) //字串結束時棧空 51 printf("括號匹配\n"); 52 else 53 printf("缺乏右括號\n"); 54 55 56 57 58 } 59 60 61 62 63 } 64 65 int main() { 66 check(); 67 return 0; 68 69 }