什么是栈?
栈是一种遵从先进后出原则的有序集合。新添加或待删除的元素都保存在栈的同一端,称作栈顶,另一端叫做栈底。在栈中,新元素都接近栈顶,旧元素接近栈底。栈通常有两种存储方法:顺序存储结构和链式存储结构。
一个栈的基本功能
1、push 添加一个(或几个)新元素到栈顶
2、pop 溢出栈顶元素,同时返回被移除的元素
3、peek 返回栈顶元素,不对栈做修改
4、isEmpty 栈内无元素返回 true,否则返回 false
5、size 返回栈内元素个数
6、clear 清空栈
class Stack {
constructor() {
this._stackArray = [];
}
// 向栈内压入元素
push(value) {
return this._stackArray.push(value)
}
// 弹出栈顶元素
pop() {
return this._stackArray.pop()
}
// 获取栈顶元素
peek() {
return this._stackArray[this._stackArray.length - 1]
}
// 判断栈是否为空栈
isEmpty() {
return !this._stackArray.length
}
// 返回栈内元素个数
size() {
return this._stackArray.length
}
// 清空栈内元素
clear() {
this._stackArray = []
}
}
利用栈把十进制转换为任意进制(最高为16进制)
假设N为需要转换的数字,n为需要转换的进制;
/**
* @desc N=120 n=8
* N N/n N%n
* 120 15 0
* 15 1 7
* 1 0 1
*
* @desc 将目标值一次一次除以进制基数,得到的取整值为新目标值,记录下余数,直到目标值小于0,最后将余数逆序组合即可。利用栈,记录余数入栈,组合时出栈。
* */
function baseConversion(num, base) {
const stack = new Stack();
// 最多只能转换16进制
const TARGET = '0123456789ABCDEF';
let result = [];
while(num > 0) {
// 记录每一次的余数
stack.push(Math.floor(num%base))
// 新的目标值
num = Math.floor(num/base)
}
while(!stack.isEmpty()) {
// 逆序组合
result.push(TARGET[stack.pop()])
}
return result.join('')
}
利用栈实现队列
队列是先进先出,我们可以使用一个栈模拟出队,一个栈模拟入队。
class StackQueue {
constructor() {
// A模拟入队 B模拟出队
this.stackA = new Stack()
this.stackB = new Stack()
}
// 入队
_stackPush(value) {
return this.stackA.push(value)
}
// 出队
_stackPop() {
if(this.stackB.isEmpty() && !this.stackA.isEmpty()) {
this._stackChange()
}
return this.stackB.pop()
};
// 把栈A元素压入栈B
_stackChange() {
while(!this.stackA.isEmpty()) {
this.stackB.push(this.stackA.pop())
}
};
}