每日一练——有效的括号

20. 有效的括号 - 力扣(LeetCode)

错误记录

cpp 复制代码
#include<stddef.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>

typedef char STDataType;

typedef struct Stack
{
	STDataType* a;
	int capacity;
	int top;
} Stack;

void STInit(Stack* st);
void STDestroy(Stack* st);

void STPush(Stack* st, STDataType x);
STDataType STPop(Stack* st);
STDataType STTop(Stack* st);
int STSize(Stack* st);
bool STEmpty(Stack* st);

void STInit(Stack* st)
{
	assert(st);
	st->a = NULL;
	st->capacity = st->top = 0;
}

void STDestroy(Stack* st)
{
	assert(st);
	free(st->a);
	st->a = NULL;
	st->capacity = st->top =  0;
}

void STPush(Stack* st, STDataType x)
{
	assert(st);
	//checkcapacity
	if (st->capacity == st->top)
	{
		int newcapacity = st->capacity == 0 ? 4 : st->capacity * 2;
		STDataType* temp = (STDataType*)realloc(st->a, sizeof(STDataType) * newcapacity);
		if (NULL == temp)
		{
			perror("realloc failed");
			exit(-1);
		}
		st->a = temp;
		st->capacity = newcapacity;
	}
	st->a[st->top] = x;
	++st->top;
}

STDataType STPop(Stack* st)
{
	assert(st);
	assert(st->top);
	STDataType ret = STTop(st);
	--st->top;
	return ret;
}

STDataType STTop(Stack* st)
{
	assert(st);
	assert(st->top);
	return st->a[st->top - 1];
}

int STSize(Stack* st)
{
	return st->top;
}

bool STEmpty(Stack* st)
{
	return st->top == 0;
}


bool isValid(char* s)
{
    Stack st;
    STInit(&st);
    int i = 0;
    while(*s)
    {
        if(*s == '(' || *s == '[' || *s == '{')
            STPush(&st, *s);
        else
        {
            if((STPop(&st) == '(' && *s != ')') ||
            (STPop(&st) == '[' && *s != ']') ||
            (STPop(&st) == '{' && *s != '}'))
            {
                STDestroy(&st);
                return false;
            }
        }
        ++s;
    }
    STDestroy(&st);
    return true;
}

这里比较三次直接出了3次栈,应该只出一次比较三次。

修改成下面这样:

之后在" ( "和" ) "又分别翻车了,加了下面两句判断。

最终提交

cpp 复制代码
#include <assert.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdlib.h>

typedef char STDataType;

typedef struct Stack {
    STDataType* a;
    int capacity;
    int top;
} Stack;

void STInit(Stack* st);
void STDestroy(Stack* st);

void STPush(Stack* st, STDataType x);
STDataType STPop(Stack* st);
STDataType STTop(Stack* st);
int STSize(Stack* st);
bool STEmpty(Stack* st);

void STInit(Stack* st) {
    assert(st);
    st->a = NULL;
    st->capacity = st->top = 0;
}

void STDestroy(Stack* st) {
    assert(st);
    free(st->a);
    st->a = NULL;
    st->capacity = st->top = 0;
}

void STPush(Stack* st, STDataType x) {
    assert(st);
    // checkcapacity
    if (st->capacity == st->top) {
        int newcapacity = st->capacity == 0 ? 4 : st->capacity * 2;
        STDataType* temp =
            (STDataType*)realloc(st->a, sizeof(STDataType) * newcapacity);
        if (NULL == temp) {
            perror("realloc failed");
            exit(-1);
        }
        st->a = temp;
        st->capacity = newcapacity;
    }
    st->a[st->top] = x;
    ++st->top;
}

STDataType STPop(Stack* st) {
    assert(st);
    assert(st->top);
    STDataType ret = STTop(st);
    --st->top;
    return ret;
}

STDataType STTop(Stack* st) {
    assert(st);
    assert(st->top);
    return st->a[st->top - 1];
}

int STSize(Stack* st) { return st->top; }

bool STEmpty(Stack* st) { return st->top == 0; }

bool isValid(char* s) {
    Stack st;
    STInit(&st);
    int i = 0;
    while (*s) {
        if (*s == '(' || *s == '[' || *s == '{')
            STPush(&st, *s);
        else
        {
            if(STEmpty(&st))
            {
                STDestroy(&st);
                return false;
            }
            char topval = STPop(&st);
            if ((topval == '(' && *s != ')') ||
                (topval == '[' && *s != ']') ||
                (topval == '{' && *s != '}'))
            {
                STDestroy(&st);
                return false;
            }
        }
        ++s;
    }
    if(!STEmpty(&st)) return false;
    STDestroy(&st);
    return true;
}

修改日志

2024/6/12

一处return的时候忘记调用STDestroy,有内存泄漏风险,补上了。

把变量top名称改成了topval,避免与Stack的成员top混杂,增强代码可读性。

相关推荐
万联WANFLOW2 小时前
异地组网速度忽快忽慢到底怎么回事?直连与中继的判断方法和处理步骤
运维·网络·网络协议·p2p
SDWAN_Cheap3 小时前
物理服务器跟云服务器有什么区别,使用于什么场景
运维·服务器
Smoothcloud润云3 小时前
GPU算力平台推荐:复现实验时,如何判断租用资源是否合适?
服务器·人工智能·深度学习·gpu算力·gpu
叼烟扛炮4 小时前
[LangChain] 学习笔记(02):LCEL 链式调用与动态模型配置实战
服务器·开发语言·网络·笔记·学习·langchain
福建佰胜张工4 小时前
深度解析 Allen-Bradley 150-B135NBDA 智能电机控制器:选型、参数与工业应用
运维·数据库·单片机·嵌入式硬件·安全·自动化
wefg14 小时前
【Docker】镜像相关指令
运维·docker·容器
feng_you_ying_li5 小时前
linux之网络层
linux·运维·网络
未来之窗软件服务5 小时前
Linux 运维日志删除的多种方式—东方仙盟
linux·运维·服务器·仙盟创梦ide·东方仙盟
卓豪终端管理5 小时前
IT 运维视角下的终端数据安全:能力框架与落地清单
运维
小雉系统5 小时前
BcoreOS实战:用一个升级包,让Rocky Linux跑进Debian服务器
linux·运维·服务器·debian