JavaScript 实现栈和队列的操作(ES5ES6)
Posted YuLong~W
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript 实现栈和队列的操作(ES5ES6)相关的知识,希望对你有一定的参考价值。
栈 和 队列 是两种重要的线性结构,从数据结构的角度看,栈和队列也是 线性表,其特殊性在于栈和队列的基本操作是线性表的子集。它们是操作受限的线性表,因此,可称为限定性的数据结构。但从数据类型角度看,它们是和线性表大不相同的两类重要的的抽象数据类型。
栈
- 所有的插入和删除操作都限制在线性表的 同一端 进行,是一种 后进先出 的线性表
- 表尾端称栈顶,表头端称栈底
ES5的写法:
//定义栈的构造函数
function Stack(){
// 用数组来模拟栈
let items=[];
//将元素送入栈,放置于数组的最后一位
this.push=function(element){
items.push(element);
};
//弹出栈顶元素
this.pop=function(){
return items.pop();
};
//查看栈顶元素
this.peek=function(){
return items[items.length-1];
}
//判断栈是否为空
this.isAmpty = function() {
return items.length === 0
};
//清空栈中所有内容
this.clear = function() {
items = [];
};
//返回栈的长度
this.size = function() {
return items.length;
};
// 以字符串显示栈中所有内容
this.print = function() {
return items.toString();
};
}
ES6写法:
//定义栈的类
class Stack{
constructor(){
// 用数组来模拟栈
this.items=[];
}
//将元素送入栈,放置于数组的最后一位
push(element){
this.items.push(element);
};
//弹出栈顶元素
pop(){
return this.items.pop();
};
//查看栈顶元素
peek(){
return this.items[this.items.length-1];
}
//判断栈是否为空
isAmpty() {
return this.items.length === 0
};
//清空栈中所有内容
clear() {
this.items = [];
};
//返回栈的长度
size() {
return this.items.length;
};
// 以字符串显示栈中所有内容
print() {
return this.items.toString();
};
}
实例应用: 将10进制数字转为2进制数字
原理: 就是输入要转换的数字,不断的除以二并取整。并且最后运用while循环,将栈中所有数字拼接成字符串输出。
/**
* @param {Number} decNumber 要转换的10进制数字
* @return {Number} 转换后的2进制数字
*/
function divideBy2(decNumber) {
let remStack = new Stack();
let rem, binaryString = '';
while (decNumber > 0) {
rem = Math.floor(decNumber % 2);
remStack.push(rem);
decNumber = Math.floor(decNumber / 2);
}
while (!remStack.isAmpty()) {
binaryString += remStack.pop().toString();
}
return binaryString;
};
console.log(divideBy2(10));
结果:
队列
- 队列也是一种线性表,是一种 先进先出 的线性结构。队列只允许在表的一端进行插入(入队)、删除(出队)操作
- 允许插入的一端称为队尾,允许删除的一端称为队头
ES5的写法:
//定义队列构造函数
function Queue() {
//用数组来模拟队列
let items = [];
//将元素推入队列
this.enqueue = function (ele) {
items.push(ele);
};
//将队列中第一个元素弹出
this.dequeue = function () {
return items.shift()
};
//查看队列的第一个元素
this.front = function () {
return items[0];
};
//判断队列是否为空
this.isAmpty = function () {
return items.length === 0
};
//返回队列的长度
this.size = function () {
return items.length;
};
//清空队列中所有内容
this.clear = function () {
items = [];
};
//以字符串显示队列中所有内容
this.print = function () {
return items.toString();
};
}
ES6的写法:
//定义队列的类
class Queue {
constructor() {
//用数组来模拟队列
this.items = [];
}
//将元素推入队列
enqueue(ele) {
this.items.push(ele);
};
//将队列中第一个元素弹出
dequeue() {
return this.items.shift()
};
//查看队列的第一个元素
front() {
return this.items[0];
};
//判断队列是否为空
isAmpty() {
return this.items.length === 0
};
//返回队列的长度
size() {
return this.items.length;
};
//清空队列中所有内容
clear() {
this.items = [];
};
//以字符串显示队列中所有内容
print() {
return this.items.toString();
};
}
实例应用: 击鼓传花的小游戏
原理: 规定输入要参与的玩家数组和击鼓次数,每次都淘汰一人,其中未被淘汰的人采用先出队列和进队列的顺序,最终剩余一人则为胜者,将其输出
/**
* @param {Array} nameList 参与人员列表
* @param {Number} num 在循环中要被弹出的位置
* @return {String} 返回赢家(也就是最后活下来的那个)
*/
function hotPotato(nameList, num) {
let queue = new Queue();
for (let i = 0; i < nameList.length; i++) {
queue.enqueue(nameList[i]);
}
let eliminated = '';
while (queue.size() > 1) {
for (let i = 0; i < num; i++) {
queue.enqueue(queue.dequeue());//先出再入
}
eliminated = queue.dequeue();
console.log(eliminated + " Get out!")
}
return '胜利者:' + queue.dequeue();
}
let nameList = ['小明', '小红', '小王', '小强'];
console.log(hotPotato(nameList, 3))
结果:
以上是关于JavaScript 实现栈和队列的操作(ES5ES6)的主要内容,如果未能解决你的问题,请参考以下文章