大家好!这篇开始,说一些栈和队列的题目,大家能够一起努力!也希望自己有一天能够不在是个咸鱼。
难度 简单 OJ链接
解题思路:
1.如果是左括号,入栈。
2.如果是右括号,出栈,然后看是否匹配。
看上面的这个例子:
前面两个是左括号,我们入栈:
第三个是右括号,出栈,栈是后进先出,所以出{,和)看是否匹配。我们可以发现是不匹配的,所以返回fase。
在看第二个例子:
我们发现,前两个是左括号,入栈。第三个是右括号,出栈,先出的是[,和右括号匹配,继续下一个,第四个是右括号,出栈,出的是{,和右括号匹配。都匹配,就返回true。
这道题,我是用C语言写的,所以一开始要写一个栈(不知道栈怎么写可以看看我前面的博客)。
typedef char STDataType;
typedef struct Stack
{
STDataType* arr;
int top;//记录栈顶
int capacity;
}ST;
//初始化定义
void StackInit(ST* ps)
{
assert(ps);
ps->arr = NULL;
ps->top = 0;
ps->capacity = 0;
}
//栈是否为空
bool StackEmpty(ST* ps)
{
assert(ps);
return ps->top == 0;
}
//销毁函数的定义
void StackDestroy(ST* ps)
{
assert(ps);
free(ps->arr);
ps->arr = NULL;
ps->top = 0;
ps->capacity = 0;
}
//插入函数的定义
void StackPush(ST* ps, STDataType x)
{
assert(ps);
if (ps->top == ps->capacity)
{
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
STDataType* tmp = (STDataType*)realloc(ps->arr, sizeof(STDataType) * newcapacity);
if (tmp == NULL)
{
printf("realloc is fall\n");
exit(-1);
}
else
{
ps->arr = tmp;
ps->capacity = newcapacity;
}
}
ps->arr[ps->top] = x;
ps->top++;
}
//删除函数的定义
void StackPop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
ps->top--;
}
//取栈顶的数据
STDataType StackTop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
return ps->arr[ps->top - 1];
}
//栈里数据的个数
int StackSize(ST* ps)
{
assert(ps);
return ps->top;
}
bool isValid(char * s){
ST st;
StackInit(&st);//初始化
while(*s)
{
//如果为左括号
if(*s=='('||*s=='{'||*s=='[')
{
StackPush(&st,*s);
s++;
}
else
{
//如果为右括号
char top=StackTop(&st);
StackPop(&st);
if((*s==')'&& top=='(')
||(*s=='}'&& top=='{')
||(*s==']'&& top=='['))
{
s++;
}
else
{
StackDestroy(&st);//销毁栈
return false;
}
}
}
StackDestroy(&st);//销毁栈
return true;
}
但是,我们运行是有错误的:
这里的错误是:只有左括号,没有右括号和它匹配,栈里面还有数据,所以我们需要在最后判断栈里是否为空。
bool isValid(char * s){
ST st;
StackInit(&st);
while(*s)
{
if(*s=='('||*s=='{'||*s=='[')
{
StackPush(&st,*s);
s++;
}
else
{
char top=StackTop(&st);
StackPop(&st);
if((*s==')'&& top=='(')
||(*s=='}'&& top=='{')
||(*s==']'&& top=='['))
{
//匹配,继续比
s++;
}
else
{
StackDestroy(&st);//销毁栈
return false;
}
}
}
//如果栈不为空,说明还有左括号未出
//没有匹配,返回false
bool ret=StackEmpty(&st);
StackDestroy(&st);//销毁栈
return ret;
}
还有一个错误:
当我们只输入一个"]"(右括号),此时栈里没有数据,但我们写的还是取栈顶元素就会发生断言错误,所以我们应该加一个判断。
正确的代码如下:
如果是C语言,我们要自己加一个栈。
好了,这道题先到这里,如果大家觉得有帮助,希望多多支持!大家一起加油!