给定一个字符串,其中的字符只包含三种括号:{ }、[ ]、( ),即它仅由 “( ) [ ] { }” 这六个字符组
成。编写代码,判断该字符串是否有效。
有效字符串需满足:
1.左括号必须以相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
如:s="()" 返回true s=="([{]" 返回false
#include <stdio.h>
#include "stdbool.h"
#include "malloc.h"
#include "assert.h"
#define LinkElemtype char
typedef struct LinkStackNode
{
LinkElemtype data;
struct LinkStackNode* next;
}LinkStackNode;
typedef struct LinkStack
{
LinkStackNode* head;
}LinkStack;
// 初始化栈
void LinkStackInit(LinkStack* ps);
// 入栈
void LinkStackPush(LinkStack* ps, LinkElemtype v);
// 出栈
void LinkStackPop(LinkStack* ps);
// 获取栈顶元素
int LinkStackTop(LinkStack* ps);
//判空
bool LinkEmpty(LinkStack* ps)
{
assert(ps != NULL);
return ps->head == NULL;
}
void LinkStackInit(LinkStack* ps)
{
assert(ps != NULL);
ps->head = NULL;
}
void LinkStackPush(LinkStack* ps,LinkElemtype v)
{
assert(ps != NULL);
LinkStackNode* s = (LinkStackNode*)malloc(sizeof(LinkStackNode));
assert(s!= NULL);
s->data = v;
s->next = ps->head;
ps->head = s;
}
void LinkStackPop(LinkStack* ps)
{
assert(ps != NULL);
if (LinkEmpty(ps))
{
printf("栈空");
return;
}
LinkStackNode* p = ps->head;
ps->head = p->next;
}
int LinkStackTop(LinkStack* ps)
{
assert(ps != NULL);
if (LinkEmpty(ps))
{
printf("栈空");
return 0;
}
return ps->head->data;
}
bool isValid(char * s){
if(s==NULL)
return false;
LinkStack st;
LinkStackInit(&st);
while(*s!='\0')
{
if(*s=='('||*s=='['||*s=='{')
{
LinkStackPush(&st,*s);
}
else
{
if(LinkEmpty(&st))
return false;
char top=LinkStackTop(&st);
if((*s==')'&&top!='(')||(*s==']'&&top!='[')||(*s=='}'&&top!='{'))
return false;
LinkStackPop(&st);
}
s++;
}
if(!LinkEmpty(&st))
return false;
return true;
}