栈的详解和例题(力扣有效括号)

这篇具有很好参考价值的文章主要介绍了栈的详解和例题(力扣有效括号)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

栈的详解和例题(力扣有效括号),开发语言,数据结构

感谢各位大佬的光临,希望和大家一起进步,望得到你的三连,互三支持,一起进步

个人主页:LaNzikinh-CSDN博客

收入专栏:初阶数据结构_LaNzikinh篮子的博客-CSDN博客

文章目录

  • 前言
  • 一.什么是栈
  • 二.栈的实现
  • 三.例题(力扣)
  • 总代码

前言

之前讲了,很多关于栈的习题,还有栈与队列的互相转换,还是补一篇栈的详解


一.什么是栈

栈的详解和例题(力扣有效括号),开发语言,数据结构

栈(stack)是一种只允许在一端进行插入和删除操作的线性表。这一端称为栈顶,另一端称为栈底。栈的特点是后进先出(LIFO),即最后进入的元素最先出来。栈可以用来存储局部变量和一些数据,当函数或线程执行完毕,栈就会释放空间。

二.栈的实现

这样的实现它分为两种,一种是用数组去实现栈,另一种就是用链表去实现栈,我们这里主要讲的是用数组去实现栈,用链表实现栈又叫做链式栈,如果用尾做为栈顶那么尾插尾删就要设计成双向链表,否则删除数据效率会很低。

2.1结构

注意:初始化时把top=0的话,top可以看成有栈中的元素总数,不是栈顶的元素下标!!

栈的详解和例题(力扣有效括号),开发语言,数据结构

typedef int STDataType;
typedef struct stack
{
	STDataType* a;
	int top;
	int capacity
}ST;

其实就可以把它看成一个顺序表,top就是size的意思,它用来控制栈顶的元素的

2.2初始化

初始化时,top给的是0的话,意味着top栈顶数据的指向下一个,top给-1的话,意味着top就是栈顶数据

void stackInit(ST* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->top = 0;//ps->top=-1;
	ps->capacity = 0;
}

2.3放入数据

这里和顺序表的扩容和插入一模一样

void stackPush(ST* ps, STDataType x)
{
	assert(ps);
	//检查扩容
	if (ps->top == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(ps->a,sizeof(STDataType) * newcapacity);
		assert(tmp);
		ps->a = tmp;
		ps->capacity = newcapacity;
	  }
	ps->a[ps->top] = x;
	ps->top++;

}

 2.4删数据和取栈顶元素

我初始化的top为0,所以取栈顶元素的下标是top-1

void stackPop(ST* ps)
{
	assert(ps);
	assert(ps->top > 0);
	ps->top--;
}

STDataType stackTop(ST* ps)
{
	assert(ps);
	assert(ps->top > 0);
	//我初始化的top为0,所以取栈顶元素的下标是top-1
	return ps->a[ps->top -1 ];
}

2.5检查栈中还要元素和释放

bool stackEmpty(ST* ps)
{
	assert(ps);
//说明栈里没有元素了
	if (ps->top == 0)
		return true;
	else
		return false;
}
void stackDestroy(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = ps->top = 0;
}

然后我们来看一道例题

三.例题(力扣)

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"
输出:true
输入:s = "(]"
输出:false

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

思路:利用栈算法先搭建一个栈,然后我们先让左括号入栈,在让左括号出栈和右括号匹配

注意:因为如果用C语言去写,c语言中的库没有栈的,所以必须自己搭建一个栈,就是我们上面写的

3.1

我们先断言一下传来的不能是空指针,然后对栈进行初始化,然后设置一个循环,意思是说等这个字符串走完了之后这个循环就出了,第一步判断我们先得让左括号入栈,如果是左括号的就入栈,然后字符串加加

assert(s);
ST st;
stackInit(&st);
while (*s)
{
	if (*s == '(' || *s == '{' || *s == '[')
	{
		stackPush(&st, *s);
		s++;
	}

3.2

然后如果不是左括号我们就可以进行第一次判断了,如果遇到了右括号,但是栈里没有数据,说明前面没有右括号不匹配,我们直接退出,如果不是这个错误的话,我们就可以取栈顶元素,把这个括号取出来删掉,然后进行左括号匹配,如果不是就直接退出,注意:stackDestroy(&st);为什么我要提前放不在后面放,因为我在这里就退出了存在开屏内存没有释放会造成内存泄露。

else
{
	if (stackEmpty(&st))
	{
		return false;
	}
	STDataType top = stackTop(&st);
	stackPop(&st);
	if ((*s == ')' && top != '(') || (*s == '}' && top != '{') || (*s == ']' && top != '['))
	{
		stackDestroy(&st);
		return false;
	}
	else {
		s++;
	}

}

3.3

如果只有左括号没有右括号呢,所以我的结尾判断还需要特殊一点,如果栈里还有元素的话就说明还存在左括号没有出去没有匹配,所以我也不能返回正确

bool ret = stackEmpty(&st);
stackDestroy(&st);
return ret;

总代码

注意这个题目是符号判断,所以我的STDataType是char类型的文章来源地址https://www.toymoban.com/news/detail-847887.html

typedef char STDataType;
typedef struct stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;

void stackInit(ST* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->top = 0;
	ps->capacity = 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 = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);
		assert(tmp);
		ps->a = tmp;
		ps->capacity = newcapacity;
	}
	ps->a[ps->top] = x;
	ps->top++;

}

void stackDestroy(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = ps->top = 0;
}

void stackPop(ST* ps)
{
	assert(ps);
	assert(ps->top > 0);
	ps->top--;
}

STDataType stackTop(ST* ps)
{
	assert(ps);
	assert(ps->top > 0);
	return ps->a[ps->top - 1];
}

bool stackEmpty(ST* ps)
{
	assert(ps);
	if (ps->top == 0)
		return true;
	else
		return false;
}
bool isValid(char* s)
{
	assert(s);
	ST st;
	stackInit(&st);
	while (*s)
	{
		if (*s == '(' || *s == '{' || *s == '[')
		{
			stackPush(&st, *s);
			s++;
		}
		else
		{
			if (stackEmpty(&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;

}

到了这里,关于栈的详解和例题(力扣有效括号)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【追梦之旅】——栈居然还能这样玩?!+ 力扣 - 有效括号

        😎博客昵称:博客小梦 😊最喜欢的座右铭:全神贯注的上吧!!! 😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主! 😘博主小留言:哈喽! 😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不

    2024年02月05日
    浏览(42)
  • 【数据结构】顺序栈的基本操作:出栈、入栈、取栈顶元素、输出所有栈中元素、括号匹配题目

    栈是限定仅在表位进行插入或删除操作的线性表。栈的表尾称为栈顶,表头称为栈底。不含元素的栈称为空栈。 左图为栈的示意图,右图为用铁路调度表示栈。 如下是入栈至栈满再进行出栈的过程示意图。值得注意的是,栈满后,top指针指向的不是顶端元素,而是顶端的下

    2024年02月07日
    浏览(52)
  • 【数据结构OJ题】有效的括号

    原题链接:https://leetcode.cn/problems/valid-parentheses/ 目录 1. 题目描述 2. 思路分析 3. 代码实现   这道题目主要考查了 栈 的特性: 题目的意思主要是要做到3点匹配: 类型、顺序、数量 。 题目给的例子是比较简单的情况,可能还有如下较为复杂的情况: 循环遍历 字符串s中的字

    2024年02月12日
    浏览(33)
  • 数据结构学习之顺序栈应用的案例(有效的括号)

    实例要求: 给定一个 只包括 \\\'(\\\',\\\')\\\',\\\'{\\\',\\\'}\\\',\\\'[\\\',\\\']\\\' 的 字符串 s , 判断字符串是否有效 ; 有效字符串需满足的条件: 1、左括号必须 用相同类型的右括号 闭合; 2、左括号必须 以正确的顺序闭合 ; 3、每个右括号都有一个 对应的相同类型 的左括号; 相关案例: 实例分

    2024年01月21日
    浏览(47)
  • 数据结构和算法的部分例题(力扣)

    1.1 合并一个数组的两个有序区间 2.1 反转单向链表 (方法1)构建一个新的链表,从就链表依次拿到每个节点,创建新的节点添加至新链表头部,完成后的新链表就是倒序的,简单,但是需要创建新的对象 (方法2)与方法1类似,构建新的链表,从头部移除节点,添加至新链

    2024年01月18日
    浏览(53)
  • 【数据结构与算法】6、栈(Stack)的实现、LeetCode:有效的括号

    🌱 栈 是一种特殊的线性表, 只能在一端进行操作 🌱 往栈中 添加 元素的操作,一般叫做 push ( 入栈 ) 🌱 从栈中 移除 元素的操作,一般叫做 pop ,出栈(只能移除栈顶元素),也叫做: 弹出栈顶元素 🌱 后进先出 的原则, L ast I n F irst O ut, LIFO 注意:这里的 栈 与内

    2024年02月13日
    浏览(38)
  • 数据结构与算法之字符串: Leetcode 20. 有效的括号 (Typescript版)

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

    2024年02月01日
    浏览(50)
  • 数据结构链表力扣例题AC(2)——代码以及思路记录

    给你单链表的头节点  head  ,请你反转链表,并返回反转后的链表。 AC方法1 代码思路 观察示例,1-2-3-4-5 == 5-4-3-2-1 要将箭头的方向都旋转,假设从左向右改变,第一步2-1,用两个指针 n1 和 n2 分别指向1和2,使 n2 指向 n1 就可以实现了,但是此时由于 2 之前保存的 3 的地址,

    2024年02月21日
    浏览(44)
  • 【数据结构】栈的详解

    ☃️个人主页:fighting小泽 🌸作者简介:目前正在学习C语言和数据结构 🌼博客专栏:数据结构 🏵️欢迎关注:评论👊🏻点赞👍🏻留言💪🏻 栈:一种特殊的 线性表 ,其只允许在 固定的一端 进行 插入和删除元素 操作。进行数据插入和删除操作的一端称为 栈顶 ,另一

    2024年02月05日
    浏览(51)
  • 【数据结构】栈的实现(C语言)

    文章目录 1.栈 1.1 栈的定义 1.2 C语言实现栈 1.2.1接口函数 1.2.2栈的创建 1.2.3栈的初始化  1.2.4栈的销毁 1.2.5压栈 1.2.6出栈 1.2.7判断栈是否为空 1.2.8取栈顶元素 1.2.9 栈有多少个数据  1.3 C语言实现栈的具体代码 头文件stack.h 接口函数stack.c 测试函数test.c         栈(stack)又名堆

    2024年02月05日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包