括号匹配问题:
原理:
1、括号匹配成功的情况:栈为空
2、括号匹配失败的情况:
a、下一个为右括号但是和栈顶左括号不匹配
b、下一个是右括号但栈以空
c、所有的空号都匹配完成后栈不空
代码实现:
1、方法一
bool isValid(char * s){
char *stack = (char*)malloc(strlen(s)+1);
int top = 0;
int i;
// if(s[0] == ')' || s[0] == ']' || s[0] == '}')
// return false;
for(i = 0;i < strlen(s);i ++){
if(s[i] == '(' || s[i] == '[' || s[i] == '{'){
top ++;
stack[top] = s[i];
}
else {
if((s[i] == ')' && stack[top] == '(') || (s[i] == ']' && stack[top] == '[') || (s[i] == '}' && stack[top] == '{'))
top --;
else
return false;
}
}
if(top == 0)
return true;
else
return false;
}
方法二:
bool isValid(char * s){
char *stack = (char*)malloc(strlen(s)+1);
int top = 0;
int i;
// if(s[0] == ')' || s[0] == ']' || s[0] == '}')
// return false;
for(i = 0;i < strlen(s);i ++){
if(s[i] == '(' || s[i] == '[' || s[i] == '{'){
top ++;
stack[top] = s[i];
}
else
//由ASCALL表可知
if((stack[top]+1) == s[i] || (stack[top]+2) == s[i])
top --;
else
return false;
}
}
if(top == 0)
return true;
else
return false;
}
方法三:
bool isValid(char *s){
//SqStack S;
char *Stack = (char*)malloc(strlen(s));
//InitStack(S);
int top = -1;
for(int i = 0;i < strlen(s);i ++){
if(s[i] == '(' || s[i] == '[' || s[i] == '{'){
top ++;
Stack[top] = s[i];
}
else{
if(top == -1)
return false;
char topElem;
if(s[i] == ')' && Stack[top] != '(')
return false;
if(s[i] == ']' && Stack[top] != '[')
return false;
if(s[i] == '}' && Stack[top] != '{')
return false;
top --;
}
}
if(top == -1)
return true;
else
return false;
}