每日一练——有效的括号

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混杂,增强代码可读性。

相关推荐
高山有多高4 分钟前
【Linux笔记】UpdSocket
linux·运维·笔记
皓月盈江13 分钟前
Linux系统grep、sed 、awk介绍下,使用方法及区别?
linux·运维·服务器·sed·grep·awk
宵时待雨35 分钟前
MySQL数据库1:数据库基础
服务器·数据库·mysql
云栖梦泽37 分钟前
Linux内存管理
linux·运维·服务器
吴声子夜歌42 分钟前
Nginx应用与运维——Nginx Web服务应用实战(静态文件服务器的搭建)
运维·前端·nginx
Lucis__1 小时前
编译链接全链路解析:ELF形成到可执行加载的发展历程
linux·程序·elf文件
海宇服务1 小时前
零信任架构实战:基于海宇身份证OCR构建自动化自助终端核验网关
运维·人工智能·架构·自动化
开开心心就好1 小时前
图片白底怎么去掉?抠图工具抠完背景透明
java·服务器·开发语言·pdf·ocr·散列表·启发式算法
ken22321 小时前
ubuntu 24.04, audacity 4 AppImage 加载 libavdevice.so.62 /.61 /.63 失败:依赖缺失?
linux·运维·ubuntu
NightReader1 小时前
vCenter8部署
linux