数据结构:栈和队列(1)

一。栈

1.概念:栈是限定在一端进行插入或删除操作的线性表。因此,对栈进行插入删除操作的这一端称为栈顶(top),另一端称为栈底。不含元素的栈称为空栈。栈中的元素遵循**后进先出的特性。**插入数据称为入栈/进栈,删除数据称为出栈

2.入栈和出栈顺序:顺序不一定,可以有很多出栈顺序,如下图:

看一道例题:

求以元素d开头的序列个数,就是出栈的第一个元素是d,那么abcd就要先入栈,然后d出栈,至于abce的出栈和e的入栈,分类讨论即可,如下图:

3.静态顺序栈和动态顺序栈结构

栈的顺序存储实现可以用静态数组,称为静态顺序栈。使用堆上动态申请数组实现,称为动态顺序栈。重点是动态顺序栈

(1)静态顺序栈的定义:

(2)动态顺序栈的定义:

(3)动态顺序栈的实现

注意:栈在初始化时,top=-1指向的是栈顶元素,入栈时要先++top,再把入栈元素放到top位置。top=0时指向的是栈顶元素的下一个位置,入栈时要先把入栈元素放到top的位置,再++top。

核心接口函数的实现:

补充:链式栈的实现(没有哨兵位)

(1)定义

(2)初始化和销毁

(3)元素入栈

关键点说明:

元素入栈就是在链式栈中头插元素。首先要修改newNode的指向,它要指向下一个节点,栈顶指针就是指向写一个元素,所以就要使newNode->next = s->topHead。然后新的节点称为栈顶指针,即s->topHead = newNode。

(4)元素出栈

关键点说明:元素出栈就是要修改元素之间的链接关系,也就是使头节点指向第二个元素,同时记录栈顶元素的地址(因为要确保链式存储结构不能断),即 LSNode* delNode = s->topHead 和 s->topHead = delNode->next。

(5)获取栈顶元素,栈中有效元素个数,检测栈是否为空,如果是空返回真,否则返回假

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

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

思路:如果遇到左括号,就入栈。如果是右括号,就依据有效字符串的规则与栈中元素进行比较

特殊情况1:如果给的样例全是左括号,例如"(((((",那么开辟的栈就是空栈,后续进行top访问时就会出错

特殊情况2:如果样例是"))))))))",会错误的判断为正确

反思:

(1)写代码要有边界思维,时刻注意特殊情况

(2)动态开辟的栈,要记得销毁

(3)知识点选取:栈的核心特性->后进先出,这是选用栈解决本题根本原因:最近打开的括号,必须最先闭合。例: ( ) ,最后出现的 ,最先遇到闭合 ,完美契合栈"后进先出"。结论:遇到"最近匹配"类问题,优先想到栈。

相关推荐
青山木3 小时前
Hot 100 --- 电话号码的字母组合
java·数据结构·算法·leetcode·逻辑回归
闪电悠米3 小时前
力扣hot100-240.搜索二维矩阵2-单调性剪枝详解
数据结构·算法·leetcode·矩阵·哈希算法
雨落在了我的手上3 小时前
Java数据结构(九):栈和队列
java·开发语言·数据结构
春生野草4 小时前
个人笔记--大顶堆和基数排序
java·数据结构·算法
paeamecium6 小时前
【PAT甲级真题】- Rational Sum (20)
数据结构·c++·python·算法·pat考试·pat
Highcharts.js12 小时前
教程:基于 React + Highcharts 构建一个单页应用程序、按需数据拉取与图表渲染
开发语言·前端·数据结构·react.js·前端框架·highcharts·页面应用
稚南城才子,乌衣巷风流18 小时前
动态开点:原理、实现与应用场景
数据结构·算法
yyds_yyd_1008618 小时前
1464. 数组中两元素的最大乘积(2026.07.27)
数据结构·c++·算法·leetcode
白白白小纯1 天前
算法篇—返回倒数第k个节点
c语言·数据结构·算法·leetcode