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);
}