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

<!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.οnclick=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>

操作结果


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值