2-栈结构

栈也是一种常见的数据结构,并且在程序中的应用非常广泛。
数组
我们知道数组是一种线性结构,并且可以在数组的任意位置插入和删除数据
但是有时候,我们为了实现某些功能,必须怼这种任意性加以限制
而栈和队就是比较常见的受限的线性结构,我们首先来学习栈结构

栈结构示意图
2 栈结构 - 图1
灰色示意当我们有操作的时候只能在一端进行操作,如我们删除栈底的第一个那么我们需要先从栈顶开始操作。

栈(stack),它是一种受限制的线性表,后进先出(LIFO)
其限制是仅允许在表的一端,进行插入和删除运算,这一端被称之为栈顶,相对地,把另一端称位栈底。
LIFO(last in first out)表示就是后进入的元素,第一个弹出栈空间,类似于羽毛球筒(不能拆,且只能从一端或称之为顶端有序拿取。),最后放在栈顶的元素,有栈操作就需要先把最放的也就是栈顶的拿出来操作。
向一个栈插入新元素又称之为进栈、入栈、压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素。
从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

程序中使用栈实现

  1. 我们知道函数之间和互相调用:A调用B,B中又调用C,C中又调用D。
  2. 那样在执行的过程中,会先将A压入栈,A没有执行完,所以不会弹出栈。
  3. 在A执行的过程中调用了B,会将B压入到栈,这个时候B在栈顶,A在栈底。
  4. 如果这个时候B可以执行完,那么B会弹出栈,但是B有执行玩么?没有,它调用了C。
  5. 所以C会压栈,并且在栈顶,而C调用了D,D会压入栈顶。
  6. 当前的栈顺序就成了这样:栈底A->B->C->D栈顶。
  7. D执行完,弹出栈,C/B/A依次弹出栈。
  8. 所以我们在函数调用栈的称呼,就来自于它们内部的实现机制。(通过栈来实现的)

函数调用栈示意图:
2 栈结构 - 图2

栈结构的实现
实现栈结构又两种比较常见的方式:
基于数组实现
基于链表实现

栈的操作
push(element):添加一个新元素到栈顶位置。
pop():移除栈顶的元素,同时返回被移除的元素。
peek():返回栈顶的元素,不对栈做任何修改(这个方法不会移除栈顶的元素,仅仅是返回它)。
isEmpty():如果栈里没有任何元素就返回true,否则发挥false。
size():返回栈里的元素个数,这个方法和数组的length属性类似。
toString():将栈结构的内容以字符形式返回。

代码展示-基于js:
// Method:和某一个对象实例有联系
// function
// 封装栈类
function Stack() {
// 栈中的属性
this.items = [];
// 栈的相关操作

  1. // 1 将元素压入栈<br /> // 1.1 this 指向<br /> // this.push=function(){ //给某个对象的实例添加了方法,那就是每个实例都要拥有一个这样的方法。<br /> // };<br /> // 1.2 类.prototype<br /> Stack.prototype.push = function (element) { // 相当于给整类添加了方法,这种则是共享的,比较节约内存。<br /> this.items[this.items.length] = element;<br /> }<br /> // 以上两种代码不同指向来说本质是一样的。
  2. // 2 取出栈顶元素也就是最后一个元素<br /> Stack.prototype.pop = function () {<br /> return this.items.pop();<br /> }<br /> // 3 查看一下栈顶元素也就是最后一个进栈的<br /> Stack.prototype.checkLast = function () {<br /> return this.items[this.items.length - 1];<br /> }<br /> // 4 判断栈是否为空<br /> Stack.prototype.isEmpti = function () {<br /> return this.items.length == 0;<br /> }<br /> // 5 获取栈中元素的个数<br /> Stack.prototype.size = function () {<br /> return this.items.length;<br /> }<br /> // 6 toString方法<br /> Stack.prototype.toString = function () {<br /> let resultString = "";<br /> for (let i = 0; i < this.items.length; i++) {<br /> resultString += (" " + this.items[i]);<br /> }<br /> return resultString;<br /> }<br /> }
  3. let stack = new Stack();<br /> let array1 = [1, 32, 434, 66, 34, 534];<br /> for (let i = 0; i < array1.length; i++) {<br /> stack.push(array1[i]);<br /> }<br /> console.log("-------执行类了push------");<br /> console.log(stack.items);<br /> console.log("-------执行类了pop------");<br /> console.log(stack.pop());<br /> console.log(stack.items);<br /> console.log("-------执行类了checkLast------");<br /> console.log(stack.checkLast());<br /> console.log("-----执行类了isEmpti------");<br /> console.log(stack.isEmpti());<br /> console.log("-----执行类了size------");<br /> console.log(stack.size());<br /> console.log("-----执行类了toString------");<br /> console.log(stack.toString());