
思路:用栈实现
程序员Carl分析:
顺序栈的实现
#define MAXSIZE 10000
struct Stack{
char* arr;
int head;
}stack;
void InitStack() {
stack.arr = (char*)malloc(MAXSIZE*sizeof(char));
stack.head = 0;
}
void StackPush(char s) {
assert(stack.head<MAXSIZE);
stack.arr[stack.head++] = s;
}
char StackPop() {
assert(stack.head);
return stack.arr[--stack.head];
}
int StackEmpty() {
if(stack.head == 0)
return 1;
return 0;
}
算法的实现
int checkMatch(char s1, char s2) {
if(s1 == '(') {
return s2 == ')';
} else if(s1 == '{') {
return s2 == '}';
} else if(s1 == '[') {
return s2 == ']';
}
return 0;
}
int getLength(char* s) {
int count = 0;
while(s[++count]) {
;
}
return count;
}
bool isValid(char * s){
int length = getLength(s);
InitStack();
int i = 0;
for(i = 0; i < length;i++) {
if(s[i] == '(' || s[i] == '{' || s[i] == '[') {
//将元素入栈
StackPush(s[i]);
} else {
//出栈栈顶元素,看是否匹配
if(StackEmpty()||!checkMatch(StackPop(),s[i]))
return 0;
}
}
//如果栈空,则代表所有括号都有匹配,返回1
if(StackEmpty())
return 1;
return 0;
}

缺陷:
改进:用了链栈实现。空间复杂度降低了,但是时间却上升了