此数据结构算法知识点系列笔记均是看coderwhy老师视频整理得出!!!
程序 = 数据结构 + 算法
数据结构的技术概念
数据结构就是在计算机中,存储和组织数据的方式
栈
- 基于数组或者链表(后续会介绍)实现
- 数组是一种线性结构,并且可以在数组的任意位置插入和删除数据
- 而栈和队列就是对这种任意性加以限制,是比较常见的受限的线性结构
- 后进先出(LIFO->last in first out)
- 向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;
- 从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
程序中什么是使用栈实现的呢?
学了这么久的编程,是否听说过,函数调用栈呢?
我们知道函数之间和相互调用:A调用B,B中又调用C,C中又调用
- 那样在执行的过程中,会先将A压入栈,A没有执行完,所有不会弹出栈.
- 在A执行的过程中调用了B,会将B压入到栈,这个时候B在栈顶,A在栈底.
- 如果这个时候B可以执行完,那么B会弹出栈.但是B有执行完吗?没有,它调用了C.
- 所以C会压栈,并且在栈顶.而C调用了D,D会压入到栈顶.
- 所以当前的栈顺序是:栈顶A->B->C->D栈顶
- 执行完,弹出栈.C/B/A依次弹出栈.
- 所以我们有函数调用栈的称呼,就来自于它们内部的实现机制.(通过栈来实现的)
面试题目
有六个元素6,5,4,3,2,1的顺序进栈,下列哪个出栈顺序不正确?
A. 5 4 3 6 1 2
B. 4 5 3 2 1 6
C. 3 4 6 5 2 1
D. 2 3 4 1 5 6
根据栈特点,必须要严格执行先进后出,进栈顺序也一定是6 5 4 3 2 1
拿A来举例 从选项入手,
第一个出栈的是5是先出栈,那么必定 是6,5被依次先进栈,然后5出栈,栈里剩6
然后是4出栈,说明5出栈之后,4进栈,并出栈,栈里剩下6
然后是3出栈,说明4出栈之后,3进栈并出栈,栈里剩下6
然后是6出栈,栈里没有东西了
然后是1出栈,说明2,1是依次进栈的,然后1,2依次出栈
栈常见的有哪些操作
- push():添加一个新元素到栈顶
- pop():移除栈顶元素,并返回被移除的元素
- peek():返回栈顶的元素,不对栈做任何修改(这个方法不会移除栈顶的元素,仅仅是返回它)
- isEmpty():如果栈里无任何元素就返回 true,否则返回false
- size():返回个数,和length类似
- toString():
<script>
// 封装栈类
function Stack() {
this.items = [];
//1.push
// this.push = function () {};
Stack.prototype.push = function (ele) {
this.items.push(ele);
};
// 2.pop
Stack.prototype.pop = function () {
return this.items.pop();
};
// 3.peek
Stack.prototype.peek = function () {
return this.items[this.items.length - 1];
};
//4.isEmpty
Stack.prototype.isEmpty = function () {
return this.items.length === 0;
};
//5.size
Stack.prototype.size = function () {
return this.items.length;
};
//6.toString
Stack.prototype.toString = function () {
// 将数组内容以逗号隔开,并组成字符串
return this.items.join(",");
};
}
// 栈的使用
var useStack = new Stack();
useStack.push(1);
useStack.push(2);
console.log(useStack.items); //[1, 2]
useStack.pop();
console.log(useStack.items); //[1]
useStack.peek();
console.log(useStack.items); //[1]
...
</script>
实现一个十进制转换为2进制的函数
基于上面封装的栈类实现
function to2(num) {
// 定义对象
var stack = new Stack();
// 循环操作
while (num > 0) {
// 获取余数,压栈
stack.push(num % 2);
// 获取整数后的结果,做为下一次执行的初始值
num = Math.floor(num / 2);
}
// 从栈中取出 0 1
var binaryString = "";
while (!stack.isEmpty()) {
binaryString += stack.pop();
}
return binaryString;
}
console.log(to2(100)); //1100100