L-括号匹配
题解
这一题很显然是用栈来解决,但我还是决定写一下题解,因为最后一个有一个测试点总过不去。
首先栈中存储的是字符而不能是下标,为什么呢?,因为在匹配的过程中会出现 {[}],其实这是不匹配的,必须成对出现,即{[]},开始我应该是理解错了,用了三个栈,不过没必要。
#include <iostream> #include <stack> using namespace std; string s; stack <char> st; int ans1 = 0, ans2 = 0; bool flag = false; int main() { getline(cin, s); for (int i = 0; i < s.size(); ++i) { if (s[i] == '(' || s[i] == '[' || s[i] == '{') { st.push(s[i]); ++ans1; } else if (s[i] == ')') { if (!st.empty()) { if (st.top() == '(') st.pop(); else flag = true; } else { flag = true; } ++ans2; } else if (s[i] == '}') { if (!st.empty()) { if (st.top() == '{') st.pop(); else flag = true; } else { flag = true; } ++ans2; } else if (s[i] == ']') { if (!st.empty()) { if (st.top() == '[') st.pop(); else flag = true; } else { flag = true; } ++ans2; } } cout << ans1 << " " << ans2 << endl; if (!st.empty()) { flag = true; } if (!flag) { puts("YES"); } else { puts("NO"); } return 0; }