[数据结构与算法]Note

括号匹配

//裁剪字符串,掐头去尾只保留被括号包围的部分
void trim(const char exp[], int& lo, int& hi) {
    while ((lo <= hi) && (exp[lo] != '(') && (exp[lo] != ')'))
        lo++;
    while ((lo <= hi) && (exp[hi] != '(') && (exp[hi] != ')'))
        hi--;
}
//分割字符串,分割成左右,即"("与")"括号相同的多个部分
int divide(const char exp[], int lo, int hi) {
    int mi = lo; int crc = 1;
    while ((0 < crc) && (++mi < hi))
    {
        if (exp[mi] == ')') crc--;
        if (exp[mi] == '(') crc++;
    }
    return mi;
}
//综合上述两部分,递归求解
bool paren(const char exp[], int lo, int hi) {
    trim(exp, lo, hi);
    if (lo > hi) return true;
    if (exp[lo] != '(') return false;
    if (exp[hi] != ')') return false;
    int mi = divide(exp, lo, hi);
    if (mi > hi) return false;
    return paren(exp, lo + 1, mi - 1) && paren(exp, mi + 1, hi);
}
//上述是递归版
//下面迭代版
bool paren(const char exp[], int lo, int hi) {
    stack<char> s;
    for (int i = 0; i <= hi; ++i) {
        switch (exp[i])
        {
        case '(':
        case '[':
        case '{':
            s.push(exp[i]);
            break;
        case ')':
            if ((s.empty()) || (s.top() != '('))
                return false;
            s.pop();
            break;
        case ']':
            if ((s.empty()) || (s.top() != '['))
                return false;
            s.pop();
            break;
        case '}':
            if ((s.empty()) || (s.top() != '{'))
                return false;
            s.pop();
            break;
        default:
            break;
        }
    }
    return s.empty();
}

 

上一篇:[网络流]


下一篇:【动态规划】背包问题-例题分析