当前位置: 首页 > article >正文

栈----数据结构

在这里插入图片描述

  • 🔆栈的概念
  • 🔆栈的结构
  • 🔆栈的实现
  • 🔆括号匹配问题
  • 🔆结语

🔆栈的概念

  • 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。**进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。**栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
  • 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶
  • 出栈:栈的删除操作叫做出栈。出数据也在栈顶

🔆栈的结构

在这里插入图片描述
在这里插入图片描述

🔆栈的实现

数组栈gitt代码链接

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。

  • 数组栈
    在这里插入图片描述
  • 链式栈
    在这里插入图片描述

🔆括号匹配问题

OJ链接

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例一:

输入:s = “()”
输出:true

示例二:

输入:s = “()[]{}”
输出:true

示例三:

输入:s = “(]”
输出:false

  • 解题思路:

在这里插入图片描述

  • 答案:
//动态栈的实现
typedef char STDataType;

typedef struct Stack {
	STDataType* a;
	//top 指向栈顶
	int top;
	//capacity表示栈的容量
	int capacity;
}ST;

//创建栈
ST* STCreate() {
	ST* stack = (ST*)malloc(sizeof(ST));
	if (stack == NULL) {
		perror("malloc::");
		return NULL;
	}
	STInit(stack);
	return stack;
}

//栈的初始化
void STInit(ST* ps) {
	assert(ps);
	ps->a = NULL;
	//top为-1时表示指向栈顶,top为0时表示指向栈顶的下一个
	ps->top = -1;
	ps->capacity = 0;
}

//栈的判空
bool STEmpty(ST* ps) {
	assert(ps);
	return ps->top == -1;
}

//栈的判满
bool STFull(ST* ps) {
	assert(ps);
	return (ps->top + 1 == ps->capacity);
}

//入栈
void STPush(ST* ps, STDataType val) {
	assert(ps);
	if (STFull(ps)) {
		int newcapacity = ((ps->capacity == 0) ? 4 : (2 * ps->capacity));
		STDataType* tmp = (STDataType*)realloc(ps->a, newcapacity * sizeof(STDataType));
		if (tmp == NULL) {
			perror("realloc::");
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity = newcapacity;
	}
	(ps->top)++;
	ps->a[ps->top] = val;
}

//出栈
void STPop(ST* ps) {
	assert(ps);
	assert(!STEmpty(ps));
	(ps->top)--;
}

//获取栈元素个数
int STSize(ST* ps) {
	assert(ps);
	return (ps->top) + 1;
}

//获取栈顶元素
STDataType STTop(ST* ps) {
	assert(ps);
	return ps->a[ps->top];
}

//销毁栈
void STDestroy(ST* ps) {
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->top = -1;
	ps->capacity = 0;
	free(ps);
}

bool isValid(char* s){
    int len = strlen(s);
    if (len <= 1) {
        return false;
    }

    ST* st = STCreate();

    char* cur = s;
    while (*cur) {
        if (*cur == '(' || *cur == '[' || *cur == '{') {
            STPush(st, *cur);
        }else if (*cur == ')' || *cur ==']' || *cur == '}') {
            if (STEmpty(st) || 
            (*cur == ')' && STTop(st) != '(') || 
            (*cur == ']' && STTop(st) != '[') || 
            (*cur == '}' && STTop(st) != '{')) {
                return false;
            }

            STPop(st);
        }
        cur++;
    }

    if (!STEmpty(st)) {
        return false;
    }

    STDestroy(st);
    st = NULL;

    return true;
}

🔆结语

到这里这篇博客已经结束啦。
这份博客👍如果对你有帮助,给博主一个免费的点赞以示鼓励欢迎各位🔎点赞👍评论收藏⭐️,谢谢!!!
如果有什么疑问或不同的见解,欢迎评论区留言欧👀


http://www.kler.cn/a/2428.html

相关文章:

  • BenchmarkSQL使用教程
  • 【人工智能】用Python实现图卷积网络(GCN):从理论到节点分类实战
  • C 数组:索引魔杖点化的数据星图阵列
  • javaScriptBOM
  • js html转pdf
  • Go框架比较:goframe、beego、iris和gin
  • 测试用例的价值与体系(软件测试入门)
  • 字符串的反转以及巧用反转 ------关于反转,看这一篇就足够了
  • 架构师必须要掌握的大小端问题
  • TCP/UDP协议
  • 【CMake手册篇】CMake帮助手册的使用
  • 第二十天SpringBootWeb请求、响应、分层解耦
  • 【Unity入门】3D物体
  • Spring《一》快速入门
  • Java SpringBoot接口,用于代理转发,隐藏真实接口
  • python绘制三维图
  • 从头开始完成一个STM32例程
  • java坦克大战(2.0)
  • 用队列实现栈和用栈实现队列(C 语言)
  • 51单片机之喝水提醒器
  • 点云目标检测
  • 【Linux】进程优先级 环境变量
  • win10远程桌面:通过系统自带mstsc可远程,RDO不能远程
  • redis入门实战一、五种数据结构的基本操作(二)
  • http和https的区别?
  • 【web前端开发】CSS背景相关内容