一.题目的分析
题目如下:
这题其实是一道关于栈的经典面试题,我们可以思考如何通过栈来完成这题。首先我们知道栈是后进先出的线性表,我们即可利用这一特性,来比较是否为有效的括号,具体思路如下:
我们应当先定义一个栈用来存放括号,当然也应完成栈的基本功能----初始化、出栈、压栈、检查是否为空栈、返回栈顶元素等…
我们完成栈功能的实现后,🍁首先我们创建一个栈的结构体指针并且初始化,🍁接着计算出给定的字符串的长度,如果字符串长度为奇数则不可能满足题目要求,🍁接着将字符串的长度作为接下来循环的次数,🍁在循环体中依次判断每一个字符,如果为左括号则将左括号压入栈,如果为右括号则判断是否与当前栈顶的元素所匹配为有效的括号,如果匹配成功则删除栈顶元素,反之返回false
,最后在循环结束后,判断当前是否为空栈,如果为空栈则返回true
反之返回false
。
二.代码的实现
typedef struct stack
{
char* a;
int top;
int capacity;
}ST;
void InitST(ST* s)
{
assert(s);
s->a = (char*)malloc(sizeof(char) * 4);
if (s->a == NULL)
{
perror("malloc fail");
return;
}
s->capacity = 4;
s->top = -1;///top记录指向的当前元素
}
bool STEmpty(ST* s)
{
assert(s);
if (s->top == -1)
return true;
return false;
}
void Push(ST* s, char x)
{
assert(s);
if (s->top + 1 == s->capacity)
{
s->a = (char*)realloc(s->a, sizeof(char) * s->capacity * 2);
if (s->a == NULL)
{
perror("malloc fail");
return;
}
s->capacity *= 2;
}
s->a[s->top + 1] = x;
s->top++;
}
char STTop(ST* s)
{
assert(s);
return s->a[s->top];
}
void Pop(ST* s)
{
assert(s);
assert(!STEmpty(s));
s->top--;
}
bool isValid(char* s) {
ST ps;
InitST(&ps);
int len = strlen(s);
int cur = 0;
int count = 0;
while (len--)
{
if (s[cur] == ')' || s[cur] == ']' || s[cur] == '}')
{
if (STEmpty(&ps))
{
return false;
}
if (s[cur] == ')')
{
if(STTop(&ps)=='(')
Pop(&ps);
else
return false;
}
else if (s[cur] == ']')
{
if (STTop(&ps) == '[')
Pop(&ps);
else
return false;
}
else if (s[cur] == '}')
{
if (STTop(&ps) == '{')
Pop(&ps);
else
return false;
}
else
return false;
}
if (s[cur] == '(' || s[cur] == '[' || s[cur] == '{')
{
Push(&ps, s[cur]);
}
count++;
cur++;
}
if (STEmpty(&ps))
return true;
else
return false;
}