栈的应用一:JavaScript实现数字进制间的相互转换

来源:互联网 发布:仙剑4for mac打不开 编辑:程序博客网 时间:2024/05/19 20:42
<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="X-UA-Compatible" content="ie=edge">    <title>栈的应用一:数字进制间的相互转换</title></head><body>    <input id="num" placeholder="请输入十进制数字"><br/><br/>    <input id="base" placeholder="需要转化为的进制数"><br/><br/>    <button id="send">生成</button><br/>    <div id="result"></div></body><script>//------------------------------------------- 栈的函数实现:实际应用这部分可封装起来------------------------------------//// 属性:// top  栈数组的第一个空位置 = 栈顶元素的位置+1 ,top处是空的,它处于栈顶元素之上  (top从0开始,0代表在栈底,及栈是空的),同时也为了标记哪里可以加入新元素,当向栈内压入元素时, 该变量增大// 即:第 栈顶元素的 数组下标是 top - 1// empty 栈内是否含有元素,用 length 属性也可以达到同样的目的//  方法:// push() 元素入栈,// pop() 元素出栈,(也可以访问栈顶的元素,但是调用该方法后,栈顶元素被删除)// peek() 预览栈顶元素,只返回栈顶元素,不删除它。// length() 返回栈内元素的个数(top应该是等于数组的length的,所以用top属性也可)// clear() 清除栈内所有元素//1.栈类的构造函数function Stack() {    this.dataStore = []; //底层数据结构是数组    this.top = 0; //top应该是等于数组的length的    this.push = push;    this.pop = pop;    this.peek = peek;    this.length = length;    this.clear = clear;}/** * 2. push() * 向栈中压入一个新元素, 需要将其保存在数组中变量 top 所对 * 应的位置, 然后将 top 值加 1, 让top指向数组中下一个空位置 * 特别注意 ++ 操作符的位置, 它放在 this.top 的后面, 这样新入栈的元素就被放在 * top 的当前值对应的位置, 然后再将变量 top 的值加 1, 指向下一个位置 * */function push(element) {    this.dataStore[this.top++] = element;}/** * 3. pop() * pop() 方法恰好与 push() 方法相反——它返回栈顶元素, 同时将变量 top 的值减 1 * 也可以改造一下,只--this.top,不返回栈顶元素 * */function pop() {    return this.dataStore[--this.top];}/** * 4. peek() * peek() 方法返回数组的第 top-1 个位置的元素, 即栈顶元素 * */function peek() {    return this.dataStore[this.top-1];}function length(){    return this.top;}function clear() {    this.top = 0;}/** * 5.测试 Stack 类的实现 * */var s = new Stack();s.push("David");s.push("Raymond");s.push("Bryan");console.log("length: " + s.length());console.log(s.peek());var popped = s.pop();console.log("The popped element is: " + popped);console.log(s.peek());s.push("Cynthia");console.log(s.peek());s.clear();console.log("length: " + s.length());console.log(s.peek());s.push("Clayton");console.log(s.peek());//-----------------------------------------------栈的应用一:数制转换--------------------------------------------//// 利用栈将一个数字从一种数制转换成另一种数制。// 假设想将数字 n 转换为以 b 为基数// 的数字, 实现转换的算法如下:// (1) 最高位为 n % b, 将此位压入栈。// (2) 使用 n/b 代替 n。// (3) 重复步骤 1 和 2, 直到 n 等于 0, 且没有余数。// (4) 持续将栈内元素弹出, 直到栈为空, 依次将这些元素排列, 就得到转换后数字的字符// 串形式。//  下面就是该函数的定义, 可以将十进制的数字转化为二至九进制的数字:function mulBase(num, base) {    var s = new Stack();    do {        s.push(num % base);        num = Math.floor(num /= base);    } while (num > 0);    var converted = "";    while (s.length() > 0) {        converted += s.pop();    }    return converted;}var button=document.getElementById("send");button.onclick=function(){var num = document.getElementById("num").value;var base = document.getElementById("base").value;var result= document.getElementById("result");var newNum = mulBase(num, base);result.innerHTML=num + " converted to base " + base + " is " + newNum;//输出: 32 converted to base 2 is 100000  125 converted to base 8 is 175}</script></html>

操作结果


原创粉丝点击