通过JavaScript实现Stack数据结构
Intro
Javacript 中本不存在 Stack 堆数据结构,但是在日常开发和刷题过程中,无可避免需要使用到 Stack 进行更加高效的数据处理
什么是Stack
Stack 堆是一个线性的数据结构,支持以先入后出,后入先出的顺序增加删除元素
JavaScript 中使用 Array 实现 Stack
// stack class
class Stack {
constructor() {
// 用于实现 stack 的数组
this.items = [];
}
// 用于实现 stack 能力的函数
// push(item)
// pop()
// peek()
// isEmpty()
// printStack()
}
通过使用构造器的方式,每次新建一个 Stack 实例都将创建一个对应的数组承载数据
Push函数向 Stack 顶端推入数据
push(element) {
this.items.push(element);
}
Pop函数将 Stack 顶端的数据移除,当没有顶端数据时,返回 undefined(Stack 为空时返回 undefined)
pop() {
// 返回 Stack 顶端的元素
// 将其从 Stack 中移除
// 若 Stack 为空,则返回 undefined
if(this.items.lengthj == 0)
return undefined;
return this.items.pop();
}
Peek函数将会返回 Stack 顶端的元素,与Pop不同的是,将不会移除该元素
peek() {
return this.items[this.items.length -1];
}
isEmpty函数用于判断 Stack 是否为空
// 返回 true 则为空
isEmpty() {
return this.items.length == 0;
}
printStack函数,通过字符串相连的方式返回 Stack 中的所有元素(也可以通过数组返回输出,不做限定)
printStack() {
var str = "";
for (var i = 0; i < items.length; i++) {
str += this.items[i] + ' ';
}
return str;
}
length函数,获取 Stack 的长度
length() {
return this.items.length;
}
Example
下面,我们将会使用一些例子来验证我们的 Stack Class 是否可用
// 创建 Stack 实例
var stack = new Stack();
// return true
console.log(stack.isEmpty());
// return undefined
console.log(stack.pop());
// 向 Stack 中加入元素
stack.push(10);
stack.push(20);
stack.push(30);
// 打印 Stack
// prints 10 20 30
console.log(stack.printStack());
// returns 30
console.log(stack.peek());
// returns 30 并将其移出 Stack
console.log(stack.pop());
// returns 10 20
console.log(stack.printStack());
Stack 在后缀表达式中的运用
什么是后缀表达式
输入: str = “2 3 1 * + 9 -“ 输出: -4 计算方式:3 * 1 + 2 - 9 计算规则:遇到运算符时将运算符前的两个数字进行运算并暂存,若不存在运算符,或运算符前不具有两个数据,则表达式不成立
function postFixEvaluation(exp){
for(var i = 0; i < exp.length; i++) {
var c = exp[i];
if (!isNaN(c))
stack.push(c - '0');
else {
var val1 = stack.pop();
var val2 = stack.pop();
if (val1 == undefined || val2 == undefined)
return 'invalid postfix evaluation'
switch(c) {
case '+':
stack.push(val1 + val2);
break;
case '-':
stack.push(val1-val2);
break;
case '*':
stack.push(val1 * val2);
break;
case '/':
stack.push(val1 / val2);
break;
}
}
}
return stack.pop()
}
// returns 9
console.log(postFixEvaluation("235*+8-"));
// returns invalid postfix evaluation
console.log(postFixEvaluation("23*+"));
使用 Stack 对数组进行翻转
function reverse(str) {
let stack = new Stack();
// push letter into stack
for (let i = 0; i < str.length; i++) {
stack.push(str[i]);
}
// pop letter from the stack
let reverseStr = '';
while (stack.length > 0) {
reverseStr += stack.pop();
}
return reverseStr;
}
console.log(reverse('JavaScript Stack')); //kcatS tpircSavaJ
使用 Stack 进行进制转换
function mulBase(num, base) {
var stack = new Stack();
var converted = '';
do {
stack.push(num%base);
num = Math.floor(num /= base);
} while (num > 0)
while( stack.length() > 0 ) {
converted += stack.pop()
}
}
var num = 32;
var base = 2;
var newNum = mulBase(num, Base)
// newNum = 100000