括号匹配

143 阅读1分钟
bool isLeft(char c)//左符号
{
  return (c == '(') || (c == '[') || (c == '{') || (c == '<');
}

bool isRight(char c)//右符号
{
  return (c == ')') || (c == ']') || (c == '}') || (c == '>');
}

bool isQuot(char c)//引号、双引号
{
  return (c == '\'') || (c == '\"');
}

bool isMatch(char left, char right)//是否匹配
{
  return ((left == '(')&&(right == ')')) ||
         ((left == '[')&&(right == ']')) ||
         ((left == '{')&&(right == '}')) ||
         ((left == '<')&&(right == '>')) ||
         ((left == '\'')&&(right == '\'')) ||
         ((left == '\"')&&(right == '\"'));
}

bool parse(const char* code)//解析字符串
{
    LinkedStack<char> stack;
    int i = 0;
    bool ret = true;
    code = (code == NULL)?"":code;
    while(ret && (code[i] != '\0'))
    {
        if(isLeft(code[i]))//左符号
        {
            stack.push(code[i]);//压栈
        }
        else if(isRight(code[i]))//右符号
        {
            //当前字符是右符号,与栈顶元素匹配
            if((stack.size() > 0) && isMatch(stack.top(), code[i]))
            {
                stack.pop();//弹出
            }
            else
            {
                ret = false;
            }
        }
        else if(isQuot(code[i]))//引号、双引号
        {
            //栈为空或当前符号与栈顶元素不匹配
            if((stack.size() == 0) || !isMatch(stack.top(), code[i]))
            {
                stack.push(code[i]);//压栈
            }
            //当前元素与栈顶元素匹配
            else if(isMatch(stack.top(), code[i]))
            {
                stack.pop();//弹栈
            }
        }
        i++;
    }
    return ret && (stack.size() == 0);
}