js-数据结构和算法-栈

这篇博客介绍了如何利用栈数据结构实现十进制到二进制和其他任意进制的转换。通过创建Stack类并定义相关操作如push、pop、peek等,展示了如何将数值转换成不同进制的字符串。示例代码包括了从十进制转换到二进制的具体实现,并扩展到了任意进制的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义

栈是一种遵从后进先出(LIFO)原则的有序集合。新添加的或待删除的元素都保存在栈的
末尾,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。

思路:

  • 首先,我们需要一种数据结构来保存栈里的元素。可以选择数组:var items = [];
  • 接下来,要为我们的栈声明一些方法。
    • push(element(s)):添加一个(或几个)新元素到栈顶。
    • pop():移除栈顶的元素,同时返回被移除的元素。
    • peek():返回栈顶的元素,不对栈做任何修改(这个方法不会移除栈顶的元素,仅仅返回它)。
    • isEmpty():如果栈里没有任何元素就返回true,否则返回false。
    • clear():移除栈里的所有元素。
    • size():返回栈里的元素个数。这个方法和数组的length属性很类似。

Stack类

function Stack () {
	let items = []
	this.push = function(v) {
	  items.push(v)
	}
	this.pop = function(v) {
	  return items.pop(v)
	}
	this.peek = function() {
	  return items[items.length - 1]
	}
	this.isEmpty = function() {
	  return items.length === 0
	}
	this.clear = function() {
	  items = []
	}
	this.size = function() {
	  return items.length
	}
	this.print = function() {
	  console.log(items.toString())
	}
}
let stack = new Stack()
console.log(stack.isEmpty())
stack.push(5)
stack.push(8)
console.log(stack.peek())
stack.push(11)
console.log(stack.size())
console.log(stack.isEmpty())
stack.push(15)
stack.pop()
stack.pop()
console.log(stack.size())
stack.print()

十进制转二进制

// 转为二进制
function divideBy2(decNumber) {
  let remStack = new Stack()
  let rem;
  let binaryString = ''
  while(decNumber > 0) {
    rem = Math.floor(decNumber % 2)
    remStack.push(rem)
    decNumber = Math.floor(decNumber / 2)
  }
  while(!remStack.isEmpty()) {
    binaryString += remStack.pop().toString()
  }
  return binaryString
}
console.log(divideBy2(10))
console.log(divideBy2(1000))
console.log(divideBy2(233))

转任意进制

function baseConverter(decNumber, base) {
  let remStack = new Stack()
  let rem;
  let baseString = ''
  let digits = '0123456789ABCDEF' // 16进制
  let prefix = {
    '2': '0b',
    '8': '0',
    '16': '0x',
  }
  prefix = !!prefix[base] ? prefix[base] : ''
  while(decNumber > 0) {
    rem = Math.floor(decNumber % base)
    remStack.push(rem)
    decNumber = Math.floor(decNumber / base)
  }
  while(!remStack.isEmpty()) {
    baseString += digits[remStack.pop()]
  }
  return prefix + baseString
}
console.log(baseConverter(1024, 20))
console.log(baseConverter(1024, 2))
console.log(baseConverter(1024, 8))
console.log(baseConverter(1024, 16))

js中有parseInt实现进制转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值