开题:

  不冒任何险,什么都不做,什么也不会有,什么也不是。

本文目录

栈介绍:

和队列一样,栈也是一种表结构,但是和队列的“先进先出”不同的是栈是“先进后出”的一种数据结构,它更像我们生活中向箱子里放东西,后放的在上面,最先被我们取出来。

由于栈是“先进后出”的结构,所以我们基本上都是对栈顶元素的操作,任何不在栈顶的元素都不能被访问,为了得到栈底的元素,我们需要删除栈顶的元素。

由以上可知,“出栈”和“入栈”操作是栈中主要的两个功能, 我们还需要设置top作为整个栈的指针,当向栈中压入元素时,该变量增大,指向最新的元素,有元素出栈时,该变量减小,指向现在的栈顶元素。我们可能只希望访问栈顶元素,并不想将它移出栈所以我们又需要一个getTop方法,再加上clear清除全栈、empty栈是否为空和length获取栈长度的方法基本上就满足了我们对于栈的使用需要。

JavaScript实现栈:

    function Inn(){
var items = [];
var top = 0; //入栈
this.push = function(obj){ items[top++] = obj;
}; //获取栈顶元素并删除
this.pop = function(){ return items[--top];
}; //获取栈顶元素但不删除
this.getTop = function(){ return items[top -1];
}; //清除栈数据
this.clear = function(){ top = 0;
}; //获取栈的长度
this.length = function(){
return top;
}; //栈是否为空
this.empty = function(){
return top === 0;
};
} var i = new Inn();
i.push({
a: 1,
b: 2
}); i.push({
c: 3,
d: 4
}); console.log(i.length());
console.log(i.pop());
console.log(i.getTop());
console.log(i.length());
i.clear();
console.log(i.length());

输出结果为:

    2
{c: 3, d: 4}
{a: 1, b: 2}
1
0

栈的应用:

实现一个优秀的算法需要一个好的数据结构来支撑,因此我们可以用栈来做好多事情,例如我们做ACM时的判断回文

1. 用栈判断回文

把相同的词汇或句子,在下文中调换位置或颠倒过来,产生首尾回环的情趣,叫做回文,也叫回环。(取自百度百科)

我们只考虑文字对应位置颠倒的情况,即文字从前往后和从后往前写都是一样的情况。比如单词“dad”,“racecar”就是回文;数字1001也是回文。

使用栈可以比较轻松的去判断一个字符是否是回文。我们可以将文字从左往右依次压入栈中,然后将将栈中数据依次弹出形成一个新的字符串,最后判断两个字符串是否相等即可。


function Inn(){
var items = [];
var top = 0; //入栈
this.push = function(obj){ items[top++] = obj;
}; //获取栈顶元素并删除
this.pop = function(){ return items[--top];
}; //获取栈顶元素但不删除
this.getTop = function(){ return items[top -1];
}; //清除栈数据
this.clear = function(){ top = 0;
}; //获取栈的长度
this.length = function(){
return top;
}; //栈是否为空
this.empty = function(){
return top === 0;
};
} var inn = new Inn();
var palindrome = '柳庭风静人眠昼,昼眠人静风庭柳'; for (var i = 0; i < palindrome.length; i++) {
inn.push(palindrome[i]);
} var palindrome2 = ''; while(!inn.empty()){
palindrome2 +=inn.pop();
} if (palindrome == palindrome2) {
console.log('这是一个回文字符串');
}else{
console.log('这不是一个回文字符串');
}

输出结果为:

    这是一个回文字符串

2. 用栈实现进制转换

在进行实现转换时我们先看一下我们十进制转换为二进制的图

我们假设将数字n转换为以b为基数的数字,实现步骤如下:

  1. 最高位为n%b, 将结果压入栈中
  2. 使用n/b 代替n
  3. 重复 1、 2直到n为0且没有余数
  4. 将栈中的数据依次弹出直到栈为空,依次将这些数据拼接,就得到了这个以b为基数的数字的字符串形式
    function Inn(){
var items = [];
var top = 0;
this.push = function(obj){ items[top++] = obj;
}; this.pop = function(){ return items[--top];
}; this.getTop = function(){ return items[top -1];
}; this.clear = function(){ top = 0;
}; this.length = function(){
return top;
}; //栈是否为空
this.empty = function(){
return top === 0;
};
} /******* 进制转换 *******/
var n = 4396;
var inn = new Inn();
do{
inn.push(n % 2);
n = Math.floor( n / 2 ); }while(n > 0); var n22 = '';
while(!inn.empty()){
n22 += inn.pop();
}
console.log(parseInt(n22));

输出结果为:

    1000100101100

JavaScript中的数据结构及实战系列(2):栈的更多相关文章

  1. JavaScript中的数据结构及实战系列

    本系列主要是讲解JavaScript中的数据结构及在实际项目中遇到的地方 JavaScript中的数据结构及实战系列(1):队列 JavaScript中的数据结构及实战系列(2):栈

  2. JavaScript中的数据结构及实战系列(1):队列

    开题 张三丰教无忌太极剑法: 还记得吗? 全都记得. 现在呢? 已经忘却了一小半. 啊,已经忘了一大半. 不坏不坏,忘得真快,那么现在呢? 已经全都忘了,忘得干干净净. 好了,你上吧. 长时间写前端代 ...

  3. javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例

    栈(Stack)是限定仅在表尾进行插入或删除操作的线性表.表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈. 栈又称为后进先出(last in first out)的线性表. 堆 ...

  4. javascript中的数据结构

    Javascript中的关键字   abstract     continue      finally      instanceof      private       this boolean ...

  5. JavaScript中常见数据结构

    数据结构 栈:一种遵从先进后出 (LIFO) 原则的有序集合:新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另一端为栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底. 队列:与上相反,一种遵循先进 ...

  6. Web高级 JavaScript中的数据结构

    复杂度分析 大O复杂度表示法 常见的有O(1), O(n), O(logn), O(nlogn) 时间复杂度除了大O表示法外,还有以下情况 最好情况时间复杂度 最坏情况时间复杂度 平均情况时间复杂度 ...

  7. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  8. ElasticSearch实战系列三: ElasticSearch的JAVA API使用教程

    前言 在上一篇中介绍了ElasticSearch实战系列二: ElasticSearch的DSL语句使用教程---图文详解,本篇文章就来讲解下 ElasticSearch 6.x官方Java API的 ...

  9. ElasticSearch实战系列五: ElasticSearch的聚合查询基础使用教程之度量(Metric)聚合

    Title:ElasticSearch实战系列四: ElasticSearch的聚合查询基础使用教程之度量(Metric)聚合 前言 在上上一篇中介绍了ElasticSearch实战系列三: Elas ...

随机推荐

  1. Caffe学习系列(二)Caffe代码结构梳理,及相关知识点归纳

    前言: 通过检索论文.书籍.博客,继续学习Caffe,千里之行始于足下,继续努力.将自己学到的一些东西记录下来,方便日后的整理. 正文: 1.代码结构梳理 在终端下运行如下命令,可以查看caffe代码 ...

  2. 每天一个Linux命令 7

    常用yum命令1)查询 yum list #查询所有可用软件包列表yum search 关键字 #搜索服务器上所有和关键字相关的包2)安装 yum -y install 包名选项: install 安 ...

  3. Greenplum 简单性能测试与分析

    如今,多样的交易模式以及大众消费观念的改变使得数据库应用领域不断扩大,现代的大型分布式应用系统的数据膨胀也对数据库的海量数据处理能力和并行处理能力提出了更高的要求,如何在数据呈现海量扩张的同时提高处理 ...

  4. KoaHub平台基于Node.js开发的Koa的skip插件代码详情

    koahub-skip koahub skip middleware koahub skip Conditionally skip a middleware when a condition is m ...

  5. 重回博客 谈一谈Node中的异步和单线程

    重回博客,这个帐号之前注册后就只发了一篇博客.听朋友建议,决定一周两次更新. 第一篇谈论一下最近想的比较多的异步的问题. 传统多线程异步 传统的异步是多线程的,当要同时做两件事的时候,他们是执行在不同 ...

  6. 1202: [HNOI2005]狡猾的商人

    1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1554  Solved: 745[Submit][Stat ...

  7. Java线程池ExecutorService

    开篇前,我们先来看看不使用线程池的情况: new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override ...

  8. 关于如何介绍spring框架。

    一.介绍Spring 1.Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架. 2.概念:轻量级的IOC(控制反转或者依赖注入).AOP(面向切面或者面向方面) ...

  9. HBase架构

    文章作者:luxianghao 文章来源:http://www.cnblogs.com/luxianghao/p/6573817.html  转载请注明,谢谢合作. 免责声明:文章内容仅代表个人观点, ...

  10. HTTP请求错误400、401、402、403、404、405、406、407、412、414、500、501、502解析

    HTTP 错误 400 400 请求出错 由于语法格式有误,服务器无法理解此请求.不作修改,客户程序就无法重复此请求. HTTP 错误 401 401.1 未授权:登录失败 此错误表明传输给服务器的证 ...