在編寫代碼的時候,經常會用到兩種括號:圓括號 “()” 和大括號 “{}” 。不管使用哪種括號,程序編譯沒有問題的其中一個重要因素就是所使用的括號是否能夠匹配上.
在編寫程序時,括號可以嵌套,即: “({()})” 這種形式,但 “({)” 或者 “({}” 都不符合要求。
括號匹配項目要求:給出任意搭配的括號,判斷是否匹配。
括號匹配項目要求:給出任意搭配的括號,判斷是否匹配。
設計思路
編寫程序判斷括號匹配問題的時候,使用棧結構會很容易:- 如果碰到的是左圓括號或者左大括號,直接壓棧;
- 如果碰到的是右圓括號或者右大括號,就直接和棧頂元素配對:如果匹配,棧頂元素彈棧;反之,括號不匹配;
實現代碼
#include <stdio.h> #include <string.h>
int top = -1; //top變量時刻表示棧頂元素所在位置 void push(char *a, int elem)
{ a[++top] = elem; }
void pop(char *a)
{ if (top == -1) return ; top--; }
char visit(char * a)
{ //調取棧頂元素,不等於彈棧,如果棧為空,為使程序不發生錯誤,返回空字符 if (top != -1)
{ return a[top]; }
else
{ return ' '; } }
int main()
{ char a[30]; char bracket[100]; printf("請輸入括號序列:"); scanf("%s", bracket); getchar(); int length = (int)strlen(bracket); for (int i=0; i<length; i++)
{ //如果是左括號,直接壓棧 if (bracket[i] == '(' || bracket[i] == '{')
{ push(a, bracket[i]); }else{ //如果是右邊括號,判斷與棧頂元素是否匹配,如果匹配,棧頂元素彈棧,程序繼續運行;否則,發現括號不匹配,輸出結果直接退出 if (bracket[i] == ')')
{ if (visit(a) == '(')
{ pop(a); }
else
{ printf("括號不匹配"); return 0; } }
else
{ if (visit(a) == '{')
{ pop(a); }
else
{ printf("括號不匹配"); return 0; } } } } //如果所有括號匹配完成,棧內為空,說明所有括號全部匹配成功 if (top != -1)
{ printf("括號不匹配"); }
else
{ printf("括號匹配"); } }
運行結果:
請輸入括號序列:{}(){
括號不匹配
