1. 认识栈结构
栈也是一种非常常见的数据结构,并且在程序中的应用非常广泛。
数组
- 我们知道数组是一种线性结构,并且可以在数组的任意位置插入和删除数据
- 但是有时候,我们为了实现某些功能,必须对这种任意性加以限制
- 而栈和队列就是比较常见的受限的线性结构,我们先来学习栈结构
栈结构示意图:
栈( stack ),它是一种受限的线性表,后进先出(LIFO)
- 其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。
- LIFO(last in first out)表示就是后进入的元素,第一个弹出栈空间,类似于自动餐托盘,最后放上的托盘,往往先把拿出去使用
- 向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素
- 从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
2. 栈的面试题
面试题目:
- 答案是C,因为出栈6,6在5的下面所以不可能出栈
- A答案:65进栈,5出栈,4进栈出栈,3进栈出栈,6出栈,21进栈,1出栈,2出栈
- B答案:654进栈,4出栈,5出栈,3进栈出栈,2进栈出栈,1进栈出栈,6出栈
- D答案:65432进栈,2出栈, 3出栈,4出栈,1进栈出栈,5出栈,6出栈
3. 栈结构封装
实现栈结构有两种比较常见的方式:
- 基于数组实现
- 基于链表实现
什么是链表?
也是一种数据结构,目前我们还没有学习,并且JavaScript中并没有自带链表结构;后续,我们会自己来实现链表结构,并且对比数组和链表的区别
因此,我们这里实现的栈结构基于数组。
4. 栈常见操作
栈常见有哪些操作呢?
- push(element):添加一个新元素到栈顶位置
- pop():移除栈顶的元素,同时返回被移除的元素
- peek():返回栈顶的元素,不对栈做任何修改(这个方法不会移除栈顶的元素,仅仅返回它)
- isEmpty():如果栈里没有任何元素就返回true,否则返回false
- size():返回栈里的元素个数。这个方法和数组的length属性很类似
- toString():将栈结构的内容以字符形式返回
现在,我们可以在类中一一实现这些方法!