C語言_解決括號匹配問題和逆波蘭表示式求值為題
阿新 • • 發佈:2018-11-04
##1、括號匹配問題:
解決思路:
void MatchBrackets (const char* str) { char* per = NULL; int i = 0; Stack s; assert (str != NULL); InitStack (&s); per = (char*)str; for (i=0; per[i] != 0; i++) { if ('(' == per[i] || '[' == per[i] || '{' == per[i]) { PushStack (&s, per[i]);//入棧 } else if (')' == per[i] || ']' == per[i] || '}' == per[i]) { char ch ; if (IsEmpty (&s) == 1)//判斷棧是否為空(等一為空,等零不為空) { printf ("右括號比左括號多!!!\n"); return ; } ch = TopNumAndTop (&s);//返回棧頂元素並出棧 switch (ch) { case '(': if (per[i] != ')') { printf ("左右括號次序匹配錯誤!!!\n"); return ; } break; case '[': if (per[i] != ']') { printf ("括號不匹配!!!\n"); return ; } break; case '{': if (per[i] != '}') { printf ("括號不匹配!!!\n"); return ; } break; } } } if (IsEmpty (&s) == 1) //判斷棧是否為空(等1為空,等0不為空) { printf ("括號匹配正確!!!\n"); } else { printf ("左括號比右括號多!!\n"); } }
測試程式碼:
void test_Match_Brackets() //括號匹配問題 { char arr1[] = "(())abc{[()]}}";//右括號比左括號多 char arr2[] = "(())abc{[(])}";//左右括號次序匹配錯誤 char arr3[] = "(())abc{[]}"; //左右括號匹配正確 char arr4[] = "(([]))abc{{([])}"; //左括號比右括號多 MatchBrackets (arr1); MatchBrackets (arr2); MatchBrackets (arr3); MatchBrackets (arr4); }
執行結果:
###2、逆波蘭表示式求值
####什麼是逆波蘭表示式:
逆波蘭表示法也叫字尾表示法,即操作符號都置於運算元的後面,逆波蘭表示法可以不用括號來標識操作符的優先順序。例如:3+4 是一箇中綴表示式,轉換成逆波蘭表示式為34+
思路:
int ReversePolishExpression (const char* str) //逆波蘭表示式求值 { Stack s; char* arr; int i = 0; assert (str != NULL); InitStack (&s); arr = (char*)str; while (*arr) { char* p1 = arr; while (*arr != ' ' && *arr != '+' && *arr != '-' && *arr != '*' && *arr != '/') { arr++; } if (*arr == ' ' && *p1 != ' ') { *arr = '\0'; PushStack (&s, StrToA (p1)); } if ((*arr == '+') || (*arr == '-') || (*arr == '*') || (*arr == '/')) { DataType a = TopNumAndTop (&s); DataType b = TopNumAndTop (&s); switch (*arr) { case '+': PushStack (&s, b+a); break; case '-': PushStack (&s, b-a); break; case '*': PushStack (&s, b*a); break; case '/': PushStack (&s, b/a); break; } } arr++; } return TopNumAndTop (&s); }
測試程式碼:
void test_ReversePolishExpression ()//逆波蘭表示式
{
char arr[] = "12 3 4 + * 6 - 8 2 / +";
printf ("%d\n", ReversePolishExpression(arr));;
}
執行結果:
注:關於本片部落格裡的棧的操作,可以參考上一篇部落格“C語言_順序棧的基本操作”