数据结构-栈

介绍

栈(Stack)是一种非常基础和常用的数据结构,它是一个只能在一端进行插入(称为“入栈”或“压栈”,通常记作 push 操作)和删除(称为“出栈”或“弹栈”,通常记作 pop 操作)的线性表。这种特殊的操作规则使得栈具有“后进先出”(Last In First Out, LIFO)的特点。

栈的基本操作包括:

  1. 初始化:创建一个空栈。
  2. 判断栈是否为空:检查栈中是否没有元素。
  3. 判满(如果适用的话):检查栈是否已达到其最大容量。
  4. 取栈顶元素:返回栈顶的元素但不删除它。这有时被称为“查看栈顶”或“peek”操作。
  5. 入栈(压栈):将元素添加到栈顶。
  6. 出栈(弹栈):移除并返回栈顶的元素。

实现举例

使用C语言数组或指针来实现栈。例如,用数组实现的顺序栈可以这样表示:

#define MAX_SIZE 100typedef int StackElement;struct Stack {StackElement data[MAX_SIZE];int top;
};void initStack(struct Stack *s) {s->top = -1; // 初始化为-1表示栈是空的
}int isEmpty(struct Stack *s) {return (s->top == -1);
}int isFull(struct Stack *s) {return (s->top == MAX_SIZE - 1);
}void push(struct Stack *s, StackElement item) {if (!isFull(s)) {s->data[++(s->top)] = item; // 入栈操作} else {printf("Stack overflow\n");}
}StackElement pop(struct Stack *s) {if (!isEmpty(s)) {return s->data[(s->top)--]; // 出栈操作} else {printf("Stack underflow\n");return 0; // 或者返回其他默认值}
}StackElement peek(struct Stack *s) {if (!isEmpty(s)) {return s->data[s->top]; // 查看栈顶元素} else {printf("Stack is empty\n");return 0; // 或者返回其他默认值}
}

实例栈的简单使用:

#include <stdio.h>int main() {struct Stack s;initStack(&s);push(&s, 10);push(&s, 20);push(&s, 30);printf("Top element is: %d\n", peek(&s)); // 输出 30printf("Popped element: %d\n", pop(&s)); // 输出 30,并从栈中移除printf("New top element is: %d\n", peek(&s)); // 输出 20return 0;
}

总结

栈的常见的应用场景

1.函数调用栈:
在程序执行过程中,每个线程都有一个由操作系统维护的内存区域(称为堆栈),用于存放函数调用时的局部变量和返回地址。每当函数被调用时,它的参数、局部变量和返回地址会被压入栈中;当函*数执行完毕返回时,这些信息会被从栈中弹出。
2.表达式求值:
编译器和解释器在处理数学或逻辑表达式时,通常使用两个栈来实现操作数和运算符的计算顺序。一个栈用于存储操作数,另一个栈用于存储运算符。这种技术可以确保正确的运算优先级。
3.深度优先搜索(DFS):
在图论和树的遍历算法中,栈常被用来实现深度优先搜索。通过不断地将当前节点的相邻节点压入栈中,然后访问栈顶的节点并重复这个过程,可以确保所有能到达的节点都被访问到。
4.括号匹配:
在解析文本中的括号序列(如编程语言中的代码块或字符串中的 HTML 标签)时,可以使用栈来检查括号是否正确配对。每遇到左括号就将其压入栈中,每遇到右括号就检查栈顶的左括号是否与之匹配,若匹配则弹出栈顶元素,否则表示不匹配。
5.回溯算法:
栈常常用于回溯算法中,例如八皇后问题、迷宫寻路等。每次探索一条路径时,都将当前状态压入栈中,以便在该路径走不通时能够回到之前的某个状态继续探索其他可能的路径。
6.浏览器的历史记录:
浏览器通常使用栈来存储用户浏览过的页面历史,后访问的页面压入栈顶,当用户点击“后退”按钮时,可以从栈顶弹出最近访问的页面。
7.计算机图形学:
栈在计算机图形学中有多种应用,例如保存视口变换的状态、实现剪裁算法等。
8.undo/redo 功能:
在许多应用程序(如文字处理器、图像编辑器等)中,undo 和 redo 功能是基于栈实现的。每个修改操作都会压入栈中,当用户需要撤销时,只需弹出最近的操作并恢复之前的状态即可。
9.自动机和词法分析器:
栈在构建有限自动机和词法分析器中也有重要应用,它们帮助识别输入串中的模式和构建语法树。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/223155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HandlerMethodArgumentResolver用于统一获取当前登录用户

这里记录回顾一些知识&#xff0c;不然就快忘记啦。 环境&#xff1a;SpringBoot 2.0.4.RELEASE需求&#xff1a;很多Controller方法&#xff0c;刚进来要先获取当前登录用户的信息&#xff0c;以便做后续的用户相关操作。准备工作&#xff1a;前端每次请求都传token&#xff0…

Leetcode—230.二叉搜索树中第K小的元素【中等】

2023每日刷题&#xff08;六十&#xff09; Leetcode—230.二叉搜索树中第K小的元素 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nul…

Oracle 数据库 control file的备份

自动备份 间接的是指&#xff0c;如果启用了CONTROLFILE AUTOBACKUP&#xff0c;那么备份时&#xff0c;也会把control file带上&#xff1a; RMAN> CONFIGURE CONTROLFILE AUTOBACKUP OFF;new RMAN configuration parameters: CONFIGURE CONTROLFILE AUTOBACKUP OFF; new…

Springboot自带logback日志配置学习

文档地址 官网地址:Core Features 中文文档地址:四、Spring Boot 特性 Spring Boot 中文文档 暂时还没有实际操作,待更新

忘记了路由器的用户名和密码,怎么办?

注意&#xff1a;登录窗口会显示路由器型号&#xff0c;请务必确认是您自己路由器的界面。 解决方法 尝试输入登录密码 如果您的确忘了设置好的密码&#xff0c;就只能把路由器恢复出厂设置&#xff0c;没有超级密码。 恢复出厂前&#xff0c;不妨尝试输入可能的管理密码。一…

和鲸科技携手深圳数据交易所,“数据+数据开发者生态”赋能人工智能产业发展

信息化时代&#xff0c;数据驱动决策的重要性日益凸显。通过利用数据可以深入了解市场需求、客户行为、竞争态势等关键信息&#xff0c;从而制定更为有效的战略和决策。围绕推动数据要素产业发展&#xff0c;近日&#xff0c;深圳数据交易所&#xff08;以下简称“深数所”&…

【注解和反射】--03 类的加载、ClassLoader

反射 【Class】哪些类型可以有Class对象&#xff1f; class&#xff1a;外部类&#xff0c;成员(成员内部类&#xff0c;静态内部类)&#xff0c;局部内部类&#xff0c;匿名内部类interface&#xff1a;接口[]&#xff1a;数组enum&#xff1a;枚举annotation&#xff1a;注…

uniapp,点击选中并改变颜色,第二次点击取消选中状态

一、效果图 二、代码实现 字符串的indexOf和数组的indexOf用法一致&#xff01; arr.indexOf(item) 该方法返回某个元素在数组中的位置。若没检索到&#xff0c;则返回 -1。 关键代码&#xff1a;(通过:class绑定) :class"selectList.indexOf(sub.type) ! -1 ? right_ite…

Linux,Windows或macOS系统的电脑怎样才能投屏到手机?

很多人都知道手机投屏到电脑的方法&#xff0c;但想要反过来的时候&#xff0c;却束手无策。 如果你想要将电脑投屏到手机&#xff0c;无论你的电脑是Windows&#xff0c;Linux还是macOS系统&#xff0c;无论你的手机是安卓、iOS还是鸿蒙&#xff0c;都可以用下面这个方法实现电…

c/c++ 文件操作(2)

文件操作读和写 顺序读写 1、fgetc、fputc 函数功能fgetc字符输入函数----->对应打开方式是 “r”fputc字符输出函数-----> 对应打开方式是 “w” 2、fgets、fputs 函数功能fgets文本行输入函数------> 对应打开方式是"r"fputs文本行输出函数------>…

Git 命令使用总结

git init: 在当前目录创建一个新的空Git仓库。git clone [url]: 从远程仓库克隆一个项目到本地。git add [file]: 将文件添加到暂存区。git commit -m “message”: 提交暂存区的文件到本地仓库&#xff0c;并添加一条提交信息。git status: 查看当前工作区的状态&#xff08;已…

说说对React高阶组件的理解?应用场景?

面试官&#xff1a;说说对高阶组件的理解&#xff1f;应用场景? 一、是什么 高阶函数&#xff08;Higher-order function&#xff09;&#xff0c;至少满足下列一个条件的函数 接受一个或多个函数作为输入输出一个函数 在React中&#xff0c;高阶组件即接受一个或多个组件作…

销售技巧培训之销售如何开场白

销售技巧培训之销售如何开场白 在销售过程中&#xff0c;开场白是至关重要的。一个好的开场白可以吸引客户的注意力&#xff0c;激发他们的兴趣&#xff0c;为后续的销售过程打下坚实的基础。然而&#xff0c;很多销售人员往往在开场白环节就犯下了错误&#xff0c;导致销售失…

go学习之网络编程

文章目录 网络编程1、网络编程的基本介绍2.网络编程的基础知识1&#xff09;协议(tcp/ip)2&#xff09;OSI与TCP/ip参考模型3&#xff09;ip地址4&#xff09;端口(port)介绍5&#xff09;tcp socket编程的客户端和服务器端 3.socket编程快速入门4.经典项目-海量用户即时通讯系…

工作记录----常用注解-----12.11

@Slf4j 它可以帮助在类中自动生成一个名为 log 的日志对象,使得在类中可以直接使用这个日志对象进行日志记录 具体来说,当你在类上添加 @Slf4j 注解后,在该类中就可以直接使用 log 对象来记录日志,无需手动创建和初始化日志对象,简化了日志的使用。例如: @Slf4j publi…

SpringBoot 3.2.0 版本 mysql 依赖下载错误

最近想尝试一下最新的 SpringBoot 项目&#xff0c;于是将自己的开源项目进行了一些升级。 JDK 版本从 JDK8 升级至 JDK17。SpringBoot 版本从 SpringBoot 2.7.3 升级到 SpringBoot 3.2.0 其中 JDK 的升级比较顺利&#xff0c;毕竟 JDK 的旧版本兼容性一直非常好。 但是在升级…

【XR806开发板试用】+ 通过网络控制led并上报按键状态

通过网络控制led并上报按键状态 本次做一个手机通过mqtt服务器控制板子上的LED亮灭&#xff0c;板子也可以将按钮状态变化通过mqtt服务器上报给手机的功能 硬件上&#xff0c;从原理图看&#xff0c;LED接到了PA21&#xff0c;高电平点亮。 按键则时接到了PA11&#xff0c;并…

C# 事件和委托的区别

这里在类中定义了一个委托和一个事件 public class MyTimerClass {// 事件public event EventHandler MyEvent;// 委托public delegate void Mydel();public Mydel mydel;public MyTimerClass(){MyEvent MyTimerClass_MyEvent;mydel new Mydel(MydelMethod);}private void M…

显示当前目录的路径

pwd 当然&#xff0c;当在多处列出各个目录的内容时&#xff0c;可能会搞不清楚到底自己处于文件系统的哪个位置上。如何判断自己当前位于哪个工作目录呢&#xff1f;答案就是pwd命令&#xff0c;它代表print working directory&#xff08;打印工作目录&#xff09;。 说明 …

GitHub帐户管理更改电子邮件

登录到您的 GitHub 帐户&#xff1a; 前往 GitHub 网站并使用您的凭据登录。 访问个人设置&#xff1a; 单击右上角的您的头像&#xff0c;然后选择“Settings”&#xff08;设置&#xff09;。 选择电子邮件选项卡&#xff1a; 在左侧边栏中选择“Emails”&#xff08;电子邮…