栈结构
元素进栈操作
- 有一个执行环境栈,五个上下文。进栈时放在顶端,并且是顶端进栈,顶端出栈。
- 首先
1
进栈
3. 然后2
进栈
4. 然后3
进栈
5. 现在进行出栈操作:此时只能 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. 然后2
进入队列
3. 然后3
进入队列
4. 开始出队列:首先1
出队列
- 首先按照12345的顺序进入队列,1开始进入队列
2. 然后2开始进入队列,此时2会和1进行优先级比较,1的优先级大于2,所以: 3. 然后3开始进入队列,此时发现3的优先级要高于1和2,所以3要排在队列的头部 4. 然后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)
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!