{ ( hey! )[不管是电子表还是劳力士,他们的指针都是一样转动的。] } )
宁是否发现了不舒服的地方,oh这种事是无法让强迫症忍受的,没错,这里的括号是不匹配的,就像C语言中,如果你输入的括号不能匹配,那么编译就会出错,如何检测括号是否匹配就是我们今天的任务。
先谈谈思路吧,首先是将数据输入,我打算将括号作为字符一个个的存入栈中,那怎样检测括号是否匹配呢?我想这不简单嘛,既然字符都在栈中,那我就先从第一个字符开始,遍历整个栈寻找与其匹配的字符,若没有那就看下一个栈,再遍历,再看下一个再遍历,直到最后的栈。好嘛,这一趟下来算法复杂度为O(N2),不可不可,严格(fang)要求(zong)自己的小橘子决定优化算法。
算法如下:粗略的说,一个一个将括号入栈,左括号直接入栈,右括号就判段栈顶的左括号是否和它匹配,不配,就把右括号入栈,配,就把栈顶元素出栈。
详细的解析如下:
结束循环后,判断栈是否为空,栈空则表示括号匹配。
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
char * base;
char * top;
int stacksize;
}stack;
void initstack(stack*s)//栈的初始化函数
{
s->base = (char*)malloc(sizeof(char));
if (!s->base)//检测内存是否分配成功
{
exit(0);
}
s->base = s->top;
s->stacksize = 10;
}
void push(stack*s, char x)//入栈函数
{
if (s->top - s->base >= s->stacksize)//先检测是否发生上溢
{
s->base = (char*)realloc(s->base, (s->stacksize + 10) * sizeof(char));//若发生,则增加10个内存空间(动态扩容)
if (!s->base)//检测内存是否分配成功
{
exit(0);
}
s->stacksize = s->stacksize + 10;
s->top = s->base + 10;
}
*s->top = x;
s->top++;
}
int main()
{
stack * s = (stack*)malloc(sizeof(stack));
initstack(s);
char c;
printf("请输入测试用例(如{[]()}#,#标志输入结束):");
c=getchar();
push(s,c);
while (c != '#')
{
c=getchar();
if (c == '{'||c == '('||c == '[')
{
push(s, c);
}
if (c == '}'||c == ')'||c == ']')
{
if (s->base == s->top)
{
push(s, c);
}
if (c == '}')
{
if (*--(s->top) == '{')//这里解释下,*--(s->top)很明显是栈顶元素,但是这个操作已经实现了top--。变相的实现了pop功能。所以实际上是没有删除栈中的元素,只是移动top指针,不断的覆盖元素。
{
//top--已经实现,这里不需要任何操作
}
else
{
push(s, c);
}
}
if (c == ')')
{
if (*--(s->top) == '(')
{
}
else
{
push(s, c);
}
}
if (c == ']')
{
if (*--(s->top) == '[')
{
}
else
{
push(s, c);
}
}
}
}
if (s->base == s->top)
{
printf("你是个正常人");
}
else
{
printf("你可能眼睛不太好");
}
return 0;
}
have a look please