昨天看到一本书,叫做JavaScript的结构与算法,觉得不错分享一下我看的几页东西。
栈
这个定义大家可能都知道,一种先进后出的有序集合。先添加的元素保存在栈的末尾,称作栈顶,另一端就叫做栈底。
不画图了,就举个例子,把书放到箱子里,先放的书在底下,后放的在上面,那么取书的时候,先要拿出上面的才能取到下面的。
接下来就用js创建一个栈
function Stack(){
//各种属性的方法的声明
}
首先我们要选个数据结构来保存栈里的元素。可以选择数组
然后我们实现一个栈需要的方法
function Stack(){
let items=[]
//给栈里添加元素
this.push = function (element){
items.push(element)
}
//判断一个栈是否为空
this.isEmpty = function (){
return items.length == 0
}
//移除一个元素
this.pop = function (){
return items.pop()
}
//栈的大小
this.size = function (){
return items.length()
}
//返回栈的第一个元素
this.peek = function (){
return items[items.length-1]
}
//清空栈
this.clear = function (){
items = []
}
//打印栈
this.print = function (){
console.log(items.toString());
}
}
上面是我们实现的栈。 我们先来学习如何使用栈。
let stack = new Stack();
console.log(stack.isEmpty());//返回true
下来就是给栈里添加元素
stack.push(1)
stack.push(2)
stack.push(3)
测试栈的长度
console.log(stack.size());//3
然后我们删除一个栈的元素,最后清空它
stack.pop()
stack.clear()
接下来用我们的栈解决一些问题
从十进制转为二进制 因为二进制是满2进1,所以先把十进制数字跟2整除,直到结果为0为止。 让我们来完成它
function tenToTwo(num){
let remStack = new Stack(),
rem,
binaryString = '';
while(num>0){
rem = Math.floor(num % 2);
remStack.push(rem);
num = Math.floor(num / 2);
}
while(!remStack.isEmpty()){
binaryString += remStack.pop()
}
console.log(binaryString);
}
tenToTwo(10) //1010
甲方看了直摇头,这不行啊,我还想要算8进制,16进制,你看着办吧!
沉思~~~~~
one minute later
let remStack = new Stack(),
rem,
binaryString = '',
digits='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
while(num>0){
rem = Math.floor(num % base);
remStack.push(rem);
num = Math.floor(num / base);
}
while(!remStack.isEmpty()){
binaryString += digits[remStack.pop()]
}
console.log(binaryString);
}
tenToAny(10,16); //A
就像这个A一样,我们的代码真A~~~