Advertisement
zhaoyx239

Untitled

Mar 18th, 2025
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.39 KB | None | 0 0
  1. #include <iostream>
  2. #include <stack>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. int main() {
  8.     int n;
  9.     cin >> n;
  10.     char emp;
  11.     cin.get(emp);
  12.     while(emp != '\n'){
  13.         cin.get(emp);
  14.     }
  15.     // 读取括号序列
  16.     string brackets;
  17.     getline(cin, brackets);
  18.  
  19.     stack<char> stack1;  // 第一个栈,用于存储右括号
  20.     stack<char> stack2;  // 第二个栈,用于存储未匹配的右括号
  21.  
  22.     // 从后向前遍历括号序列
  23.     for (int i = n - 1; i >= 0; --i) {
  24.         if (brackets[i] == ')' || brackets[i] == ']' || brackets[i] == '}') {
  25.             stack1.push(brackets[i]);
  26.         } else if (brackets[i] == '(' || brackets[i] == '[' || brackets[i] == '{') {
  27.             char left = brackets[i];
  28.             char right;
  29.             if (left == '(') right = ')';
  30.             else if (left == '[') right = ']';
  31.             else if (left == '{') right = '}';
  32.  
  33.             int a = 1;  // 统计连续的左括号数量
  34.             while (i > 0 && brackets[i - 1] == left) {
  35.                 a++;
  36.                 i--;
  37.             }
  38.  
  39.             int b = 0;  // 统计栈顶连续的匹配的右括号数量
  40.             while (!stack1.empty() && stack1.top() == right) {
  41.                 b++;
  42.                 stack1.pop();
  43.             }
  44.  
  45.             if (a < b) {
  46.                 for(int j = 0; j < b - a; ++j){
  47.                     stack1.push(right);
  48.                 }
  49.                 for(int j = 0; j < a / 2; ++j){
  50.                     stack2.push(right);
  51.                 }
  52.             } else if (a < 2 * b) {
  53.                 for (int j = 0; j < b - (a + 1) / 2; ++j) {
  54.                     stack2.push(right);
  55.                 }
  56.             } else if (a == 2 * b) {
  57.                 continue;
  58.             } else if (a > 2 * b) {
  59.                 int remaining = a - 2 * b;
  60.                 while (remaining > 0 && !stack2.empty()) {
  61.                     if (stack2.top() == right) {
  62.                         stack2.pop();
  63.                         remaining-=2;
  64.                     } else {
  65.                         stack2.pop();
  66.                     }
  67.                 }
  68.                 if (remaining > 0) {
  69.                     cout << 0 << endl;
  70.                     return 0;
  71.                 }
  72.             }
  73.         }
  74.     }
  75.  
  76.     if (stack1.empty()) {
  77.         cout << 1 << endl;
  78.     } else {
  79.         cout << 0 << endl;
  80.     }
  81.  
  82.     return 0;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement