673 - Parentheses Balance

题意:
括号匹配, 按以下规则:
1. 若字符串为空, 则正确.
2. 若 A、B 皆正确, 则 AB 也正确.
3. 若 A 正确, 则 (A) 与 [A] 都正确.
即要求括号与中括号都要匹配.

思路:
使用栈, 如果当前字符与栈顶字符匹配(必须先进去的是左括号,外面的是右括号才算是匹配的):
1. 当前字符为 ')', 栈顶字符为 '(';
2. 当前字符为 ']', 栈顶字符为 '[';
则将栈顶字符出栈, 否则将当前字符入栈; 直至所有字符都操作完成, 若栈为空, 则整个字符串正确, 否则不正确.

要点:
当 stack 为空时, 调用 top 会返回段错误.

题目:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=103&page=show_problem&problem=614

代码:

# include <iostream>
# include <string>
# include <cstdio>
# include <cstring>
# include <vector>
# include <algorithm>
# include <cctype>
# include <iterator>
# include <assert.h>
# include <stack>
using namespace std;

// 判断字符是否为括号的一部分,(),[]
bool isParenthese(char c) {
  return (c == '(') ||
         (c == ')') ||
         (c == '[') ||
         (c == ']');
}

// 判断两个 char 是否匹配, 如 (), []
// 必须是先进去的是左括号, 外面的是右括号才算是匹配的
bool isMatch(char left, char right) {
  return (left == '(' && right == ')') ||
         (left == '[' && right == ']') ;
}

// 判断 c 与 stk 的 top 是否匹配
bool isMatchTop(const stack<char>& stk, char c) {
  if (stk.empty()) return false;

  return isMatch(stk.top(), c);
}

// 判断一行是否正确, 类似后缀表达式运算, 用一个栈来存储
// 当前字符与栈顶匹配时,就把栈顶出栈, 否则把当前字符出栈
bool isCorrect(const string& line) {
  stack<char> stk;

  for (int i=0; i<line.size(); i++) {
    if (!isParenthese(line[i])) return false;

    if (isMatchTop(stk, line[i])) {
      stk.pop();
    } else {
      stk.push(line[i]);
    }
  }

  // 若最后栈为空, 则说明完全匹配
  return stk.empty();
}

int main(int argc, char const *argv[])
{
  #ifndef ONLINE_JUDGE
    freopen("673_i.txt", "r", stdin);  
    freopen("uva_o.txt", "w", stdout); 
  #endif
  
  int numCase;
  cin >> numCase;
  cin.ignore();     // cin 后接 getline 要有 ignore

  string line;
  while (numCase--) {
    getline(cin, line);

    if (isCorrect(line)) {
      cout << "Yes" << endl;
    } else {
      cout << "No" << endl;
    }
  }
  
  return 0;
}

环境: C++ 4.5.3 - GNU C++ Compiler with options: -lm -lcrypt -O2 -pipe -DONLINE_JUDGE

你可能感兴趣的:(balance,uva,673,Parentheses)