括號匹配的檢驗
阿新 • • 發佈:2018-12-11
使用棧的結構檢驗一串輸入的括號和中括號是否匹配,只有()和[]一一對應的時候,該串才算正確的串,如:([]())和[([][])]是正確的串,[(])和([())是不正確的。
首先讀取輸入的串,檢查每個當前元素,如果是(或者[則壓入棧中,是)或]則檢查棧頂元素,如果棧頂元素與當前元素剛好閉合,則將棧頂元素彈出。換而言之,棧中儲存的內容只有(和[,當棧為空,當前元素為)或]即可判斷出當前串不正確。棧為空時串即為正確的串。
#include<stdio.h> #include<stdlib.h> #include<string.h> #define Stack_Init_Size 100 #define Stack_Increment 10 //棧的定義 typedef struct { char* base=NULL; char* top; int stacksize; }SqStack; //初始化棧 int Init(SqStack &stack){ if(!stack.base){ stack.base=(char*)malloc(Stack_Init_Size*sizeof(char)); stack.top=stack.base; stack.stacksize = Stack_Init_Size; printf("初始化成功\n"); return 0; //初始化成功 } else return -1;//表示無法初始化已出始化棧 } //獲取棧頂資料 char GetTop(SqStack stack){ if(stack.base==stack.top){ printf("棧中沒有資料\n"); return '#'; } printf("獲取棧頂資料成功\n"); return *(stack.top-1); } //往棧中插入元素 int Push(SqStack &stack,char element){ if(stack.top-stack.base==stack.stacksize){ stack.base=(char*)realloc(stack.base,Stack_Increment*sizeof(char)); stack.top=stack.base+stack.stacksize; stack.stacksize+=Stack_Increment; } *stack.top=element; stack.top+=1; printf("插入資料成功\n"); return 0;//表示成功 } //刪除棧頂元素 char Pop(SqStack &stack){ if(stack.top==stack.base){ printf("棧為空\n"); return '#'; } printf("刪除資料成功"); return *--stack.top; } //釋放棧空間 int Destroy(SqStack &stack){ free(stack.base); stack.stacksize=0; printf("銷燬棧成功\n"); return 0; } //處理資料,藉助棧判斷 int ExecuteData(SqStack &stack,char* data){ Push(stack,data[0]); for(int i=1;i<strlen(data);i++){ char top = GetTop(stack); switch(top){ case '(': if(data[i]==')')Pop(stack); else Push(stack,data[i]); break; case '[': if(data[i]==']')Pop(stack); else Push(stack,data[i]); break; case '#': if(data[i]=='('||data[i]=='['){ Push(stack,data[i]); break; } else default:return -1;break; } } if(stack.top==stack.base){ Destroy(stack); return 0; } else{ Destroy(stack); return -1; } } int main(){ SqStack stack; Init(stack); char data[180]; scanf("%s",data); int result = ExecuteData(stack,data); if(result==0)printf("括號是正確匹配的\n"); else printf("括號匹配不正確\n"); return 0; }