每日一练——有效的括号

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

相关推荐
小张同学a.17 分钟前
zabbix企业级监控平台3——服务监控与API实战
linux·运维·mysql·nginx·tomcat·zabbix
hwx154620 分钟前
Linux内核时钟
linux
Brilliantwxx1 小时前
【Linux】自动化构建工具 make 与 Makefile
linux·运维·服务器·开发语言·自动化
汉知宝科技1 小时前
专利管理软件的监控功能:从专利公开到情报获取
大数据·运维
灵晔君1 小时前
【Linux】进程(四)——进程虚拟地址空间
linux·c语言·开发语言
wsad05321 小时前
Docker 网络故障排查记:当 bridge 模式失效时,host 模式如何救场
运维·docker·容器
云边云科技_云网融合1 小时前
工业制造多厂区、供应链远程数据传输网络如何优化?
运维·服务器·网络
张毅2004-10-101 小时前
docker详解:安装docker,docker架构,docker镜像、容器、网络、存储,容器监控,容器日志,综合实验
linux·运维·docker·云原生·云计算
Yyyyyy~1 小时前
[Linux]常用指令1
linux