1.用栈实现括号匹配算法:
感兴趣的小伙伴可以打开力扣(https://leetcode-cn.com)自己尝试做一下,一定要亲自动手做!
typedef char DataType;
typedef struct Stack
{
DataType* array;//存放元素
int capacity;//栈的容量
int size;// 表示栈中有多少个元素---栈顶
}Stack;
//初始化
void StackInit(Stack* ps)
{
assert(ps);
ps->array = (DataType*)malloc(sizeof(DataType) * 3);
if (ps->array == NULL)
{
assert(0);
return;
}
ps->capacity = 3;
ps->size = 0;
}
//扩容
void CheckCapacity(Stack* ps)
{
assert(ps);
if (ps->size == ps->capacity)
{
ps->array = (DataType*)realloc(ps->array, sizeof(DataType) * ps->capacity * 2);
if (ps->array == NULL)
{
assert(0);
return;
}
ps->capacity *= 2;
}
}
//入栈
void StackPush(Stack * ps, DataType data)
{
assert(ps);
CheckCapacity(ps);
ps->array[ps->size++] = data;
}
//出栈
void StackPop(Stack* ps)
{
assert(ps);
if (StackEmpty(ps))
{
return;
}
ps->size--;
}
//获取栈顶元素
DataType StackTop(Stack* ps)
{
assert(ps && !StackEmpty(ps));
return ps->array[ps->size - 1];
}
//获取栈中元素个数
int StackSize(Stack* ps)
{
assert(ps);
return ps->size;
}
//判空
int StackEmpty(Stack* ps)
{
assert(ps);
return ps->size == 0;
}
//销毁栈
void StackDestroy(Stack* ps)
{
assert(ps);
if (ps->array)
{
free(ps->array);
ps->capacity = 0;
ps->size = 0;
}
}
bool isValid(char * s){
bool flag =false;
Stack st;
StackInit(&st);
//"(" ")"
for(int i=0;i<strlen(s);++i)
{
if(s[i]=='('||s[i]=='['||s[i]=='{')
{
StackPush(&st,s[i]);
}
else
{ //当前拿到的括号是右括号
//但是刚好栈是空的
// ")"
if(StackEmpty(&st))
{ StackDestroy(&st);
return false;
}
char top=StackTop(&st);
if((s[i]==')'&& top=='('
||s[i]==']'&& top=='['
||s[i]=='}'&& top=='{'))
{
StackPop(&st);
}
else
{
break;
}
}
}
// ")"
if(StackEmpty(&st))
{
flag=true;
}
StackDestroy(&st);
return flag;
}