1、有效的括号
【题目】
【分析】
法1:数组模拟栈:
遍历输入的字符串,使用一个栈来存储左括号,遇到右括号判断和栈顶的左括号是否匹配,匹配就将栈顶元素弹出,不匹配直接返回false。遍历完成后,如果栈是空的,则匹配成功,返回true,否则返回false。
【代码】C
bool isValid(char * s){
char stack[10000]; // 预留栈空间
int top = 0; // 栈顶指针
for (int i = 0; s[i] != '\0'; i++) {
if (s[i] == '(' || s[i] == '[' || s[i] == '{') {
// 左括号压栈
stack[top++] = s[i];
} else {
// 判断栈是否空
if (top == 0) return false;
// 左右括号判断是否匹配
switch (stack[top - 1]) {
case '(':
if (s[i] == ')') top--; else return false;
break;
case '[':
if (s[i] == ']') top--; else return false;
break;
case '{':
if (s[i] == '}') top--; else return false;
break;
}
}
}
// 判断栈是否空
return top == 0;
}
法2:
利用互相匹配的括号其ascii的值不超过2
首先利用strlen函数求出字符串长度
定义一个长度为(strlen+1)的栈,加一是方便栈顶指针操作。
定义栈顶指针top
如果是左括号,进栈
否则的话如果栈非空并且是优括号的的话,出栈
否则return false
循环结束之后,如果栈说明括号匹配成功
【代码】C
bool isValid(char * s){
int length = strlen(s);
int stk[length+1];
int top =0;
if(length % 2 == 1){
return false;
}
for(int i=0;i<length;i++){
if(s[i]=='('||s[i]=='{'||s[i]=='['){
stk[top] = s[i];
top++;
}
else if(top!=0 && abs(s[i]-stk[top-1]) <= 2 ){
top--;
}else{
return false;
}
}
return top==0;
}