这题其实可以直接在主函数中声明一个大小为10000的char类型的数组,在声明一个i作为栈顶指针就可以解决,但我想练习一下栈的几个主要函数,所以还是打了出来
#define Maxsize 10000
typedef struct{
char data[Maxsize];
int top;
}Stack;
Stack* initStack(){//初始化函数
Stack *s=(Stack *)malloc(sizeof(Stack));
s->top=0;//栈顶初始化为0,即每次入栈时都在入栈后再将自增指针
return s; //即栈顶指针每次都指向最后一个元素的下一位
}
void Push(Stack *s,char x){//入栈函数
s->data[s->top++]=x;
}
char Pop(Stack *s){//出栈函数
if(s->top>0){
s->top--;
return s->data[s->top];
}
else return '\0';
}
bool IsEmpty(Stack *s){//判空函数
if(s->top==0)return true;
else return false;
}
bool isValid(char * s){
int i;
Stack *t=initStack();
for(i=0;s[i]!='\0';i++){
if(s[i]=='{'||s[i]=='['||s[i]=='(')//如果是左括号则入栈
Push(t,s[i]);
else if(s[i]=='}'&&Pop(t)=='{')
continue;
else if(s[i]==']'&&Pop(t)=='[')
continue;
else if(s[i]==')'&&Pop(t)=='(')//如果是三种右括号之一且出栈后括号与之对应,则继续循环
continue;
else//不满足以上情况则直接返回false
return false;
}
if(IsEmpty(t))//如果循环结束后出栈出干净了,则返回true
return true;
else return false; //如果循环结束后栈内还有剩余括号,则返回false
}
执行效率不是很好,等二刷的时候会重写吧…