刷题 栈1(C)
刷题-栈1 (C语言)
题目描述:
给定一个只包括 ‘(',')','{','}','[',']’ 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例 1: 输入: “()” 输出: true
示例 2: 输入: “()[]{}” 输出: true
示例 3: 输入: “(]” 输出: false
示例 4: 输入: “([)]” 输出: false
示例 5: 输入: “{[]}” 输出: true
解题思想:
- 根据字符串的长度建立一个顺序存储结构的栈
- 逐一读取字符串中的字符,只要是左括号都压入栈内
- 若遇到右括号则与栈顶元素相比较,若不匹配则返回false,若匹配,则出栈栈顶左括号,继续读取字符
- 最后返回栈顶序号的取反值:若还有左括号在栈中即为false,若栈为空为true
代码:
bool isValid(char * s){
int top = 0;
int i;
char* p = (char*)malloc(strlen(s) + 1);
for(i = 0;i < strlen(s);i++)
{
if((s[i] == '(') || (s[i] == '[') || (s[i] == '{')){
p[top++] = s[i];
}
else{
if((--top) < 0)//top先减一,指向栈顶元素
return false;
if(s[i] == ')' && p[top] != '(')
return false;
if(s[i] == ']' && p[top] != '[')
return false;
if(s[i] == '}' && p[top] != '{')
return false;
}
}
free(p);
return !top;
}