有一些问题特别适合用栈来解决。本节就介绍几个这样的例子。
 
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
 
 

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

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

    栈就是和列表类似的一种数据结构,它可用来解决计算机世界里的很多问题. 栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样的操作很快,而且容易实现. 栈的使用遍布程序语言实现的方方面面,从表 ...

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

    <数据结构与算法JavaScript描述> 基本信息 作者: (美)Michael McMillan 译者: 王群锋 杜欢 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9 ...

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

    导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性 ...

  4. 数据结构与算法javascript描述

    <数据结构与算法javascript描述>--数组篇 导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScri ...

  5. 列表的实现-----数据结构与算法JavaScript描述 第三章

    实现一个列表 script var booklist = new List(); booklist.append('jsbook'); booklist.append('cssbook'); book ...

  6. 《数据结构与算法JavaScript描述》中的一处错误

    最近在看<数据结构与算法JavaScript描述>这本书,看到选择排序这部分时,发现一个比较大的错误. 原书的选择排序算法是这样的: function selectionSort() { ...

  7. 数据结构与算法 Javascript描述

    数据结构与算法系列主要记录<数据结构与算法 Javascript描述>学习心得

  8. 数据结构与算法JavaScript (一) 栈

    序 数据结构与算法JavaScript这本书算是讲解得比较浅显的,优点就是用javascript语言把常用的数据结构给描述了下,书中很多例子来源于常见的一些面试题目,算是与时俱进,业余看了下就顺便记录 ...

  9. 栈--数据结构与算法Javascript描述(4)

    栈 Stack 概念 栈是一种高效的数据结构,数据只能在栈顶添加或者删除,所以这样的操作很快,而且容易实现.栈的使用遍布程序语言的方方面面,从表达式求值到处理函数调用. 栈是一种特殊的列表,栈内的元素 ...

随机推荐

  1. 通过网页或Serverice远程系统网站(服务)所在服务器本地的应用程序(未成功)

    近日接了一个奇葩需求,内容如题. 实现过程中遇到一些问题,特将实现过程记录于此,供备忘及参考. 首先尝试了正常启动进程的方法,代码如下: public string RunSPApp() { Proc ...

  2. log4cpp安装

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  3. SpringXML方式配置bean的生命周期lifecycle

    在Spring中容器在初始化某个bean的时候会有相应的生命周期,类似于Servlet,有相应的init,destory等方法 例如:如下service 1 2 3 4 5 6 7 8 9 10 11 ...

  4. leetCode之Median of Two Sorted Arrays

    [题目描述] There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of ...

  5. 2018-2019-2 网络对抗技术 20165210 Exp3 免杀原理与实践

    2018-2019-2 网络对抗技术 20165210 Exp3 免杀原理与实践 免杀的概述 免杀,也就是反病毒(AntiVirus)与反间谍(AntiSpyware)的对立面,英文为Anti-Ant ...

  6. ASP.NET MVC 中使用用户控件——转

    讲讲怎么在 ASP.NET MVC2中使用用户控件.首先我们新建一个用户控件,   我们命名为SelectGroup.ascx,代码如下 <%@ Control Language="C ...

  7. PostgreSQL日志号LSN和wal日志文件简记

    弄明白日志号的原理之后,一段时间又有点忘记了,干脆整理一遍: (一)wal文件命名规则 1)在$PGDATA目录下面的pg_xlog目录中存放着xlog日志文件(10.1之后变为了pg_wal): t ...

  8. HTML字符实体(Character Entities),转义字符串(Escape Sequence) 转

    为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用.这些符号是不显示在我们最终看到的网页里的,那如果我们希 ...

  9. 通过反编译让SpecFlow支持多层属性值的验证

    需求:在使用SpecFlow时,我希望能对目标对象所关联的对象属性进行验证,但SpecFlow(Version 1.9.0)无法实现.如图中红框,可以对专户所属的金融机构的名称进行验证. 反编译步骤 ...

  10. selenium-java,解决一些加了显性等待和隐性等待都不好使的情况,以及给UI自动化加上暂停功能

    最近在UI自动化时遇到了,上一步成功操作后没有响应的情况(动画加载和浏览器加载导致实际没有问题),导致下一步无法成功操作,所有想在尝试2次操作后再次进行上一步操作解决这种情况导致的错误(其实是不想每一 ...