栈的定义与实现

简介: 我们通过对线性表进行扩展实现常用的其他数据结构,比如限制线性表的一些基本操作来实现栈和队列。


一、定义



栈是限定在表的同一端进行插入或删除的线性表,进行插入或删除操作的一端称为栈顶,另一端为栈底

插入数据元素的操作叫做入栈,删除数据元素的操作叫做出栈,它具有先进后出(First In Last Out,FILO)的特性。

微信图片10.gif


二、栈的基本操作分析



线性表可以通过顺序存储和链式存储来实现,作为操作受限的线性表也一样。

顺序存储结构中,一般会使用数组来实现,定义一个栈,约定使用 top 来存放栈顶元素的位置,当 top=-1 时表示栈为空,当 top=array.length-1 时,表示栈满。

顺序栈的数据元素空间大小是预先分配好的,当空间全部满了后再入栈会溢出,栈为空时出栈会异常。

微信图片9.png

链式存储结构中,可以使用单向链表来实现,栈的插入和删除等操作都只会在栈顶一端进行,所以把链表头部作为栈顶效率更高。

微信图片8.png

1. 入栈


顺序存储中,通过 top 来定位栈顶位置,然后做入栈操作,执行完后 top 移到新的栈顶位置。

微信图片7.gif

链式存储中,将新的结点添加到链表头部,完成入栈。

微信图片6.gif

2. 出栈


顺序存储中,通过 top 定位并获取栈顶元素,然后做出栈操作,执行完后 top 移动到新的栈顶位置。


微信图片5.gif链式存储中,获取到头部结点元素后,然后删除该结点。

微信图片4.gif


三、栈的常见应用场景



1. 函数调用


任何一种高级编程语言(C、Java 等)都支持把反复执行的程序段封装成一个函数(或方法)。

在函数中支持调用另一个函数,这种嵌套调用的方式就是基于栈来实现的。

函数相关的信息都存储在栈内的数据元素中,我们把这个称作栈帧

例如在 Java 中,程序 main -> method_1 -> method_2 -> method_3 调用情况如下:

微信图片3.gif


2. 表达式求值


我们可以使用两个栈结构来实现四则混合运算表达式的求值,两个栈分别用于存储操作数和运算符。

例如编程对  进行求值。

微信图片2.gif


3. 浏览器的前进后退功能


浏览器中对历史页面的前进后退功能,也可以使用两个栈来实现。

例如先后请求 baidu.comyahoo.comsina.com

微信图片1.gif


四、代码示例



具体的代码实现如下:

Gitee:

https://gitee.com/code_artist/DataStructure

GitHub:

https://github.com/AiJiangnan/DataStructure

目录
相关文章
|
1月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
138 9
|
26天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
24 1
|
13天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
31 5
|
28天前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
|
1月前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
|
1月前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
51 4
|
1月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
数据结构(栈与列队)
数据结构(栈与列队)
22 1
|
2月前
|
存储 JavaScript 前端开发
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
83 1
|
2月前
【数据结构】-- 栈和队列
【数据结构】-- 栈和队列
18 0