1. 栈的概念
- 先入后出、后入先出;
- 栈顶操作(插入/删除);
- 线性表,有前驱后继;
2. 栈的存储结构
- 顺序存储;
- 链式存储(链栈);
3. 栈的实现方法
- push() 栈顶添加
- pop() 栈顶移出
- peek() 返回栈顶
- size() 栈的长度
- isEmpty() 是否为空
- clear() 清除栈
4.十进制转二进制案例
思路:
(1)十进制数除以2,取余数( reminder ),知道商为 0 截止,将余数倒序排列即为二进制数;
(2)可以利用栈先按顺序将余数存入,然后再从栈顶依次取出再拼接即可;
function getBinary(data) {
// 使用数组模拟一个栈
let statck_list = []
// 先定一个变量作为结果
let result = ''
while (data > 0) {
// 获得余数
let rem = Math.floor(data % 2)
// 往栈内添加余数
statck_list.push(rem)
// 计算商并重新赋值
data = Math.floor(data / 2)
}
// 判断栈内是否存在值
while (statck_list.length) {
// 从栈顶取出数值并进行拼接
result += statck_list.pop().toString()
}
// 返回计算结果
return result
}
const res = getBinary(9)
console.log(res)
5. 拓展--进制之间的转换(十进制到二进制间)
思路:
(1)高位转地位的思路基本就是取余进栈,赋商,出栈拼接三步;
(2)低位转高位的思路是:从数字最高位开始,商乘以进制,再加上余数,即为一次计算的结果,上一次计算的结果,作为下一次的商,计算到最低位截止。(备注:这里的“商”,请结合高位转低位的“商”,进行理解)
/**
* 进制转换
* @param {*} options
* @param { number } options.data 转换数字
* @param { number } options.original_radix 原进制
* @param { number } options.object_radix 目标进制
* @returns number
*/
function DecemalConversion(options) {
let { data, original_radix = 10, object_radix = 2 } = options
// 高位转低位
if (original_radix > object_radix) {
if (data > 0) {
let stack_list = []
let calc_result = ''
while (data > 0) {
let reminder = Math.floor(data % object_radix);
stack_list.push(reminder)
data = Math.floor(data / object_radix);
}
while (stack_list.length) {
calc_result += stack_list.pop().toString()
}
return calc_result
}
}
// 低转高位
else if (original_radix < object_radix) {
if (data > 0) {
let str = data.toString()
let stack_list = str.split('');
let final_number = 0
stack_list.forEach(ele => {
const reminder = Number(ele)
final_number = final_number * original_radix + reminder;
})
return final_number
}
} else {
return data
}
}
const res = DecemalConversion({
data: 7,
original_radix: 10,
object_radix: 6
})
console.log(res)