栈结构
特点:后进先出 / 先进后出 并且只能在顶端操作
元素进栈操作
- 有一个执行环境栈,五个上下文。进栈时放在顶端,并且是顶端进栈,顶端出栈。
- 首先
1进栈 - 然后
2进栈 - 然后
3进栈 - 现在进行出栈操作:此时只能
3先出栈,因为只有这样才能让2、1出栈
6. 此时
4 进栈,出栈,5 进栈
- 此时栈内还有执行上下文
1和5,此时栈内会根据执行上下文的活跃度在站内进行调整, 如果接下来要执行的是1,则栈内发生变化为
一. 自己封装栈结构
创建栈结构就相当与创建栈结构的实例
class Stack {
container = [];
// 进栈
enter(value){
this.container.unshift(value)
}
// 出栈
leave(){
return this.container.shift()
}
// 长度
size(){
return this.container.length
}
value(){
// 克隆为了外部的操作修改内部的container
return this.container.slice(0)
}
}
二. 趁热打铁~ 面试题
十进制转换为二进制
- 内置方法实现
let num = 19870;
num.toString(2);
- 自己实现
Number.prototype.deci = function deci(){
// this => num
// sk = new Stack 创建栈结构的实例
let deciNum = this, sk = new Stack;
if(deciNum === 0) return '0'
while(deciNum > 0){
let n = Math.floor(deciNum /2),
m = deciNum % 2;
sk.enter(m);
deciNum = n;
}
return sk.value().join('')
}
let num = 19870;
console.log(num.deci())
队列结构
特点:排队 先进先出 后进后出
- 进入队列:首先
1进入队列 - 然后
2进入队列 - 然后
3进入队列 - 开始出队列:首先
1出队列
当进入队列的执行上下文有优先级时则需要进行
- 首先按照12345的顺序进入队列,1开始进入队列
- 然后2开始进入队列,此时2会和1进行优先级比较,1的优先级大于2,所以:
- 然后3开始进入队列,此时发现3的优先级要高于1和2,所以3要排在队列的头部
- 然后4开始进入队列,此时4和1、2比较发现优先级高于1和2,再和3进行比较,发现优先级与3相同,根据3和4进入队列的顺序,所以:
实现队列结构
class Queue {
container = [];
// element 元素 priority 优先级
enter(element, priority = 0){
let obj = {
element,
priority
};
// 如果进入队列的元素的优先级为0
if(priority === 0) {
// 添加到队列的队尾
this.container.push(obj);
return;
}
// 用于判断某个元素是否进行处理过
let flag = false;
for(let i = this.container.length - 1; i>=0; i--){
let item = this.container[i];
if(item.priority >= priority){
this.container.splice(i - 1, 0, obj);
flag = true;
break;
}
}
!flag ? this.container.push(obj) : null;
}
leave(){
rerrun this.container.shift();
}
size(){
return this.container.length;
}
value(){
return this.container.slice(0)
}
}
趁热打铁~ 面试题:击鼓传花
// 有8个人进行击鼓传花游戏,每个人顺序标号从1到8,传到第五个人的时候,这个人退出该游戏。
function game(n, m){
// 创建队列结构的实例
let qe = new Queue;
for(let i = 0; i< n; i++){
qe.enter(i + 1);
}
while(qe.size() > 1){
for(let i = 0; i< m - 1; i++){
qe.enter(qe.leave())
}
qe.leave();
}
return qe.value().toString();
}
console.log(8, 5)