棧應用:判斷字串中括號是否成對出現
阿新 • • 發佈:2018-12-26
練習題目
利用棧先將後出的特性,判斷字串中的數字表達式括號是否成對匹配,如果沒有給出錯誤位置資訊提示。
程式碼實現
程式碼思路很簡單,如果是左括號將左括號 就入棧,遇到右括號 棧中的左括號出棧。如果該出棧的時候,棧空 肯定匹配錯誤。還有就是表示式遍歷完畢,我們的棧 如果是全部匹配成功 ,棧肯定為空,不為空 匹配錯誤!這裡我們使用之前寫的順序棧,不清楚的可以看:線性表:順序棧演算法實現。
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <time.h> #include "SeqStack.h" //列印錯誤資訊 void PrintError(char* str,char* errMsg,char* ch) { printf("錯誤資訊:%s\n", errMsg); printf("%s\n",str); int num = ch - str; for (int i = 0; i < num; i++) { printf(" "); } printf("^\n"); } /* 利用棧 判斷表示式中括號是否成對出現,如果沒有完全匹配,列印錯誤資訊。 */ void BracketMatch() { char* dest = "1+3+2*(1-5)+5-3(+(1+3(+"; char* str = dest; SeqStack stack = Init_SeqStack(); char* ch; while (*str) { //遇到左括號,入棧 if (*str == '(') { Push_SeqStack(stack, str); } //遇到右括號,出棧進行匹配 if (*str==')') { if (IsEmpty_SeqStack(stack)) { PrintError(dest, "右括號匹配失敗", str); break; } else { Pop_SeqStack(stack); } } str++; } //遍歷完畢 棧空括號表示式正確 if (IsEmpty_SeqStack(stack)) { printf("括號表示式正確\n"); } else { while (!IsEmpty_SeqStack(stack)) { ch = Pop_SeqStack(stack); PrintError(dest, "左括號匹配失敗", ch); } } return; } int main(int argc, char *argv[]) { BracketMatch(); return 0; }