JS栈的应用和案例-进制转换

254 阅读2分钟

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)低位转高位的思路是:从数字最高位开始,商乘以进制,再加上余数,即为一次计算的结果,上一次计算的结果,作为下一次的商,计算到最低位截止。(备注:这里的“商”,请结合高位转低位的“商”,进行理解)

image.png

/**
 * 进制转换
 * @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)