开发者学堂课程【Go 语言核心编程 - 数据结构和算法: 数据结构和算法-栈】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/627/detail/9853
数据结构和算法-栈
看一个实际需求
比如:请输入一个表达式
计算式:[7*2*2-5+1-5+3-3](这个计算是从一个输入框输入的,不是在程序里直接写的)计算。
请问:计算机底层是如何运算得到结果的?注意不是简单的把算式列出运算,因为我们看这个算式7*2*2-5,但是计算机怎么理解这个算式的(对计算机而言,它接收到的就是一个字符串),我们讨论的是这个问题。
在编程的过程中经常遇到加减乘除,那我们需要了解真正的底层基础。
栈的基本使用
栈的介绍
1.有些程序员也把栈称为堆栈,即栈和堆栈是同一个概念
2.栈的英文为(stack)
3.栈是一个先入后出(FILO-First In Last Out)的有序列表。
4.栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom):
5.根据堆栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而刷除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除
栈底是动不了的
出栈和入栈的概念如图
栈一般是用数组模拟,栈顶和栈底在刚开始时候都是-1,这个时候当它有一个1入栈时候栈顶和栈底都往上移动一位,两个都在0的位置,栈底就不动了,栈顶到达最大的下标就不能再移了,一般栈都是有一个限制的。
栈的应用场景
(1) 子程序的调用;在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。(函数的执行先后顺序其实也由栈影响)
(2) 处理逢归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。(再开一个新栈,把新的数据压入新栈中)
(3) 表达式的转换与求值.像运算之类也用到栈,需要考虑到小括号,中括号,大括号
(4) 二叉树的遍历,比如中续,后续都会用到栈
(5) _图形的深度优先[depth-first)搜索法。
栈的快速入门
(1) 用数组模拟栈的使用,由于堆栈是一种有序列表,当然可以使用数组的结构来储存栈的数据内容,下面我们就用数组模拟栈的出栈,入栈等操作。一个是出栈一个是入栈还有遍历。