有效的括号
1.题目链接
2.思路
遇到左括号直接入栈
遇到右括号后左括号出栈进行匹配 并删除
3.实现
#define _CRT_SECURE_NO_WARNINGS 1
//1.左括号:入栈
//2.右括号:出栈匹配跟右括号匹配
//https://leetcode.cn/problems/valid-parentheses/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
typedef char STDataType;
typedef struct Stack
{
STDataType* a;
int top;//栈顶的位置
int capacity;
}ST;
//初始化
void StackInit(ST* ps);
//销毁
void StackDestroy(ST* ps);
//栈底插入
void StackPush(ST* ps, STDataType x);
//栈底删除
void StackPop(ST* ps);
//栈顶数据
STDataType StackTop(ST* ps);
//栈的大小
int StackSize(ST* ps);
//栈是否为空
bool StackEmpty(ST* ps);
#define _CRT_SECURE_NO_WARNINGS 1
//初始化
void StackInit(ST* ps)
{
assert(ps);
ps->a = NULL;
ps->top = 0;
//初始化 top给的是0 意味着top指向栈顶数据的下一个
//先放数据 再加1
//初始化 top给的是-1 意味着top指向栈顶数据
//先加1 再放数据
ps->capacity = 0;
}
//销毁
void StackDestroy(ST* ps)
{
assert(ps);
free(ps->a);
ps->a = NULL;
ps->capacity = ps->top = 0;
}
//栈定插入
void StackPush(ST* ps, STDataType x)
{
assert(ps);
if (ps->top == ps->capacity)
{
int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
STDataType* tmp = realloc(ps->a, sizeof(STDataType) * newCapacity);
if (tmp == NULL)
{
printf("realloc fail\n");
exit(-1);
}
ps->a = tmp;
ps->capacity = newCapacity;
}
ps->a[ps->top] = x;
ps->top++;
}
//栈顶删除
void StackPop(ST* ps)
{
assert(ps);
//警告删完了还删
assert(!StackEmpty(ps));
ps->top--;
}
//栈顶数据
STDataType StackTop(ST* ps)
{
assert(ps);
//不为空再返回栈顶
assert(!StackEmpty(ps));
//存完之后top会自加 因此top-1处是栈顶
return ps->a[ps->top - 1];
}
//栈的大小
int StackSize(ST* ps)
{
assert(ps);
//top的大小就是size
return ps->top;
}
//栈是否为空
bool StackEmpty(ST* ps)
{
assert(ps);
//top==0为真 返回1 栈是空的
//top!=0为假 返回0 栈不是空的
return ps->top == 0;
}
bool isValid(char* s)
{
ST st;
StackInit(&st);
int len = strlen(s);
while (*s)
{
if (*s == '('
|| *s == '['
|| *s == '{')
{
StackPush(&st, *s);
++s;
}
else
{
//遇到右括号了 但是栈里面没有数据 不匹配 说明
//前面没有左括号 不匹配 返回false
if (StackEmpty(&st))
{
StackDestroy(&st);
return false;
}
//只有右括号 栈是空的 调用不了栈的顶部
STDataType top = StackTop(&st);
StackPop(&st);
if ((*s == '}' && top != '{')
|| (*s == ')' && top != '(')
|| (*s == ']' && top != '['))
{
StackDestroy(&st);
return false;
}
else
{
++s;
}
}
}
//如果栈中为空 说明已经匹配完了
//如果栈中不为空 说明还有左括号没有和右括号匹配
bool ret = StackEmpty(&st);
StackDestroy(&st);
return ret;
}
4.运行结果
#17有效的括号#完