数据结构与算法JavaScript描述——栈的使用

有一些问题特别适合用栈来解决。本节就介绍几个这样的例子。

1) 数制间的相互转换                                    

可以利用栈将一个数字从一种数制转换成另一种数制。假设想将数字n 转换为以b 为基数的数字,实现转换的算法如下。

使用栈,在JavaScript 中实现该算法就是小菜一碟。下面就是该函数的定义,可以将数字转化为二至九进制的数字:

//============================使用Stack类====================================
/**
*    1.数制间的相互转换
*/
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 num = 32;
var base = 2;
var newNum = mulBase(num, base);
console.log(num + " converted to base " + base + " is " + newNum);
num = 125;
base = 8;
var newNum = mulBase(num, base);
console.log(num + " converted to base " + base + " is " + newNum);

打印如下:

2)回文                                            

回文是指这样一种现象:一个单词、短语或数字,从前往后写和从后往前写都是一样的。

比如,单词“dad”、“racecar”就是回文;如果忽略空格和标点符号,下面这个句子也是回文,“A man, a plan, a canal: Panama”;数字1001 也是回文。

使用栈,可以轻松判断一个字符串是否是回文。

我们将拿到的字符串的每个字符按从左至右的顺序压入栈。当字符串中的字符都入栈后,栈内就保存了一个反转后的字符串,最后的字符在栈顶,第一个字符在栈底。

字符串完整压入栈内后,通过持续弹出栈中的每个字母就可以得到一个新字符串,该字符串刚好与原来的字符串顺序相反。我们只需要比较这两个字符串即可,如果它们相等,就是一个回文。

代码:

//============================使用Stack类====================================
/**
*    2.判断给定字符串是否是回文
*/
function isPalindrome(word){
    var s = new Stack();
    for(var i=0; i<word.length; ++i){
        s.push(word[i]);
    }

    var rword = "";
    while(s.length() > 0){
        rword += s.pop();
    }

    if(word == rword){
        return true;
    }else{
        return false;
    }
}

//测试代码:
var word = "hello";
if (isPalindrome(word)) {
    console.log(word + " is a palindrome.");
}else {
    console.log(word + " is not a palindrome.");
}
word = "racecar";
if (isPalindrome(word)) {
    console.log(word + " is a palindrome.");
}else {
    console.log(word + " is not a palindrome.");
}

打印:

3)递归演示                                                    

这里只用栈来模拟递归过程。

为了演示如何用栈实现递归,考虑一下求阶乘函数的递归定义。首先看看5 的阶乘是怎么定义的:

5! = 5×4×3×2×1 = 120

下面是一个递归函数,可以计算任何数字的阶乘:

使用栈来模拟计算5! 的过程,首先将数字从5 到1 压入栈,然后使用一个循环,将数字挨个弹出连乘,就得到了正确的答案:120。

代码:

//============================使用Stack类====================================
/**
*    3. 使用栈模拟递归过程
*/
function fact(n){
    var s = new Stack();
    while(n > 1){
        s.push(n--);
    }

    var product = 1;
    while(s.length() > 0){
        product *= s.pop();
    }
    return product;
}

console.log(fact(5)); // 显示120

时间: 2024-12-14 18:13:55

数据结构与算法JavaScript描述——栈的使用的相关文章

数据结构与算法JavaScript描述——栈

栈就是和列表类似的一种数据结构,它可用来解决计算机世界里的很多问题. 栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样的操作很快,而且容易实现. 栈的使用遍布程序语言实现的方方面面,从表达式求值到处理函数调用. 1.对栈的操作: 栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶. 栈被称为一种后入先出的数据结构. 由于栈具有后入先出的特点,所以任何不在栈顶的元素都无法访问. 为了得到栈底的元素,必须先拿掉上面的元素. 对栈的两种主要操作是将一个元素压入栈和将一个

翻阅《数据结构与算法javascript描述》--数组篇

导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性,索引可能是整数.然而,这些数字索引在内部被转换为字符串类型,这是因为 JavaScript 对象中的属性名必须是字符串.在内部被归类为数组.由于 Array 在 JavaScript 中被当作对象,因此它有许多属性和方法可以在编程时使用. 使用数组: 1.创建数组 使用 [] 操作符 ,var a

《数据结构与算法JavaScript描述》

<数据结构与算法JavaScript描述> 基本信息 作者: (美)Michael McMillan 译者: 王群锋 杜欢 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115363398 上架时间:2014-8-5 出版日期:2014 年8月 开本:16开 版次:1-1 所属分类:计算机 > 软件与程序设计 > 网络编程 > javascript 更多关于>>> <数据结构与算法JavaScript描述> 编辑推荐 随着

数据结构与算法javascript描述

<数据结构与算法javascript描述>--数组篇 导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性,索引可能是整数.然而,这些数字索引在内部被转换为字符串类型,这是因为 JavaScript 对象中的属性名必须是字符串.在内部被归类为数组.由于 Array 在 JavaScript 中被当作对象,因此它有许多属性和方法可以在编程时使用. 使

数据结构与算法javascript描述笔记--数组篇

数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性,索引可能是整数.然而,这些数字索引在内部被转换为字符串类型,这是因为 JavaScript 对象中的属性名必须是字符串.在内部被归类为数组.由于 Array 在 JavaScript 中被当作对象,因此它有许多属性和方法可以在编程时使用. 使用数组: 1.创建数组 ① 使用 [] 操作符 ,var arr=[] ,该方法效率最高. ② 调用 Array 的构造函数创建数组,var myArr=new

第一章:数据结构与算法javascript描述

在前端工程师中,常常有一种声音,我们为什么要学数据结构与算法,没有数据结构与算法,我们一样很好的完成工作.实际上,算法是一个宽泛的概念,我们写的任何程序都可以称为算法,甚至往冰箱里放大象,也要通过开门,放入,关门这样的规划,我们也可以视作为一种算法.可以说:简单的算法是人类的本能.而算法的知识的学习则是吸取前人的经验.对于复杂的问题进行归类,抽象,帮助我们脱离刀耕火种的时代,系统掌握一个算法的过程. 随着自身知识的增长,不论是做前端,服务端还是客户端,任何一个程序员都会开始面对更加复杂的问题,算

《数据结构与算法-Javascript描述》

今年的上半年,项目原因大部分时间在写js,这期间把easyui,echarts,bootstrap都用了点皮毛,写的多了,自然也多了些感觉,不过仅局限于运用层面,于是决定再系统的看些javascript方面的书,强化运用能力,便有了这本~来自于国内知名公司前端工程师翻译自国外的书,见名知意用Javascript角度来讲数据结构和算法,一方面可以把javascript的基础知识加强,一方面加深数据结构以及算法的理解和应用. 全书篇幅不长,第一章简明扼要对javascript做了简单的介绍,基本语法

《数据结构与算法JavaScript描述》- 栈

栈是和列表类似的一种数据结构,是一种特殊的列表,可解决计算机世界里很多问题 栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样的操作很快 栈内的元素只能通过列表的一端访问,这一端称为栈顶 栈是一种后入先出(LIFO,last-in-first-out)的数据结构 对栈的两种主要操作是将一个元素压栈和弹栈,另一个常用操作是预览栈顶的元素 实现一个栈当务之急是决定存储数据的底层数据结构,这里采用数组 function Stack() { this.dataStore = []; // 存

数据结构与算法JavaScript描述——队列

队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素. 队列用于存储按顺序排列的数据,先进先出,这点和栈不一样,在栈中,最后入栈的元素反而被优先处理. 可以将队列想象成在银行前排队的人群,排在最前面的人第一个办理业务,新来的人只能在后面排队,直到轮到他们为止. 队列是一种先进先出的数据结构. 队列被用在很多地方,比如提交操作系统执行的一系列进程.打印任务池等,一些仿真系统用队列来模拟银行或杂货 店里排队的顾客. 1.对队列的操作 队列的两种主要操作是:向队列中插入新元素和删除队列中的元