合法括号
发布时间: 2018年4月2日 20:46 时间限制: 1000ms 内存限制: 128M
给定字符串,只包含以下括号:‘(‘, ‘)‘, ‘{‘, ‘}‘, ‘[‘ and ‘]‘ , 判断输入是否合法。括号匹配必按照要求:"()" and "()[]{}", 而不是 "(]" and "([)]"
输入包含多组测试数据,每组测试数据占一行,不超过80个字符的字符串。
对于每组测试数据,如果合法,输出true,否则false,每组输出占一行。
()()
((((({{{]]]]]]
true
false
#include <cstdio> #include <cstring> #include <stack> #include <iostream> #include <algorithm> using namespace std; stack<char>s; int main() { char str[100]; while (scanf("%s", &str)!=EOF) { while (!s.empty())s.pop(); int flag = 1; int len = strlen(str); for (int i = 0; i < len; i++) //判断输入的字符串中是否有不符合标准的字符 { if (str[i] == ‘(‘ || str[i] == ‘{‘ || str[i] == ‘[‘ || str[i] == ‘)‘ || str[i] == ‘}‘ || str[i] == ‘]‘) flag = 1; else { flag = 0; break; } } if (!flag) { printf("false\n"); continue; } for (int i = 0; i < len; i++) { if (str[i] == ‘(‘ || str[i] == ‘{‘ || str[i] == ‘[‘) { s.push(str[i]); //左括号就入栈 } else if (str[i] == ‘)‘ || str[i] == ‘}‘ || str[i] == ‘]‘) //如果是右括号,就看栈的顶端是否是和它配对的左括号 { if (!s.empty()) { if (str[i] == ‘)‘)str[i] = ‘(‘; else if (str[i] == ‘}‘)str[i] = ‘{‘; else if (str[i] == ‘]‘)str[i] = ‘[‘; if (s.top() == str[i]) { s.pop(); //如果匹配的话,就把左括号pop掉 } } else { flag = 0; break; } } } if (s.size())flag = 0; if (!flag)printf("false\n"); else printf("true\n"); } return 0; }
2018-04-04