1 #include <iostream> 2 #include <string> 3 #include <cstdio> 4 #include <stack> 5 using namespace std; 6 7 int main() 8 { 9 int n; 10 string ch; 11 cout << "輸入表達式數目: "; 12 cin >> n; 13 while (n--) { 14 stack<char> check; 15 int flag = 0; 16 cout << "輸入表達式: "; 17 cin >> ch; 18 int len = ch.size(); 19 int i = 0; 20 for (i = 0; i < len; i++) { 21 //"("、")"、"["、"]"、"{"、"}"、"<"、">" 22 if (ch[i] == '(' || ch[i] == '[' || ch[i] == '{' || ch[i] == '<') { 23 check.push(ch[i]); flag = 0; //左括號直接進棧 24 } 25 else if (ch[i] == ')' || ch[i] == ']' || ch[i] == '}' || ch[i] == '>') { 26 if (check.empty()) { //遇到右括號時,棧頂為空則為不匹配 27 flag = 1; break; 28 } 29 else { 30 if ((check.top() == '(' && ch[i] == ')') || (check.top() == '[' && ch[i] == ']') || 31 (check.top() == '{' && ch[i] == '}') || (check.top() == '<' && ch[i] == '>')) { 32 flag = 0; check.pop(); //出棧左括號,繼續判斷 33 } 34 else { //如果左右不匹配,則退出判斷 35 flag = 1; break; 36 } 37 } 38 } 39 } 40 if (check.empty() && !flag) { //如果棧為空,且沒有右括號出現--匹配 41 printf("匹配\n"); 42 } 43 else if (!check.empty() && !flag){ 44 cout << "不匹配: 多左括號" << check.top() << endl; 45 } 46 else if (flag && check.empty()) { 47 cout << "不匹配: 多右括號" << ch[i] << endl; 48 } 49 else if (flag && !check.empty()) { 50 switch(ch[i]) { 51 case ')' : cout << "不匹配: " << check.top() 52 << "與" << ch[i] << "匹配錯\n"; break; 53 case ']' : cout << "不匹配: " << check.top() 54 << "與" << ch[i] << "匹配錯\n"; break; 55 case '}' : cout << "不匹配: " << check.top() 56 << "與" << ch[i] << "匹配錯\n"; break; 57 case '>' : cout << "不匹配: " << check.top() 58 << "與" << ch[i] << "匹配錯\n"; break; 59 default : cout << "不匹配\n"; break; 60 } 61 } 62 cout << endl; 63 } 64 return 0; 65 }