Description:
Given a string containing just the characters ‘(’, ‘)’, ‘{’, ‘}’, ‘[’ and ‘]’, determine if the input string is valid.
An input string is valid if:
Open brackets must be closed by the same type of brackets.
Open brackets must be closed in the correct order.
Note that an empty string is also considered valid.
Example1:
Input: “()”
Output: true
Example2:
Input: “()[]{}”
Output: true
Example3:
Input: “(]”
Output: false
Example4:
Input: “([)]”
Output: false
Example5:
Input: “{[]}”
Output: true
解题方法: 用栈来做
提交代码:
typedef struct
{
char brackets[10000];
int top;
}stack;
void initStack(stack* s)
{
for (int i = 0; i < 100; i++)
s->brackets[i] = '0';
s->top = -1;
}
void pushStack(stack* s, char c)
{
s->brackets[++s->top] = c;
}
char popStack(stack* s)
{
char tmp = s->brackets[s->top];
s->brackets[s->top] = '0';
s->top--;
return tmp;
}
bool isValid(char* s)
{
char c;
stack* st=(stack*)malloc(sizeof(stack));
initStack(st);
for (int i = 0; s[i] != '\0'; i++)
{
c = s[i];
if (c == '(' || c == '{' || c == '[')
pushStack(st, c);
else
{
if (st->top == -1) return false;
char tmp = popStack(st);
if (c == ')'&&tmp == '(')
continue;
else if (c == '}'&&tmp == '{')
continue;
else if (c == ']'&&tmp == '[')
continue;
else
return false;
}
}
if (st->top != -1)
return false;
return true;
}
运行结果:
代码优化:
参考
其实只要有栈的思想就可以了,不用特意再建立栈结构和栈的函数,显得很冗余;
另外参考中录入字符的方式也值得学习。我的代码中是[for循环+变量i],显得很冗余,参考中作者的方式是 [while(*s)和s++],这样就比较清楚明了
结构(struct)的使用:
在链表中,标准的定义方式:
typedef struct Head List_Head;
typedef struct Node List;
struct Head {
int length;
List* next;
};
struct Node {
int data;
List* pre;
List* next;
};
首先是struct建立一个结构,但是后续的使用会比较麻烦,比如要定义一个结点:
struct Node newnode;
这样看起来不明了,所以可以在整个struct结构前面的加入这一句:
typedef struct Node List;
这样后面申明一个结点的时候就是:
List newnode;
这样看起来会比较简单清楚。
这里要注意的是typedef语句和struct结构在这里不能联合起来使用,即不能这么写:
typedef struct
{
int data;
List* pre;
List* next;
}List;
因为在结构定义的内部,有List* pre这个语句,这个语句是在List结构定义完成之前申明的,这个时候编译器还不知道List是什么类型,所以会报错。
在栈中,标准的结构定义方式:
typedef struct
{
char brackets[10000];
int top=-1;
}stack;
这样直接typedef+struct结构就可以了,因为栈的内部定义不需要用到指针