数据结构之栈

作者: YM雨蒙 | 来源:发表于2019-03-22 20:36 被阅读2次

栈是一种遵从后进先出(LIFO)原则的有序集合。新添加的或待删除的元素都保存在栈的
末尾,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。

咖啡厅内的一摞盘子是现实世界中常见的栈的例子。只能从最上面取盘子,盘子洗净后,也只能摞在这一摞盘子的最上面。

栈的创建

实现一个栈,当务之急是决定存储数据的底层数据结构。这里采用的是数组

  1. 创建一个类来表示栈, 声明stack
function Stack() {
  // 各种属性和方法的声明
}
  1. 首先,我们需要一种数据结构来保存栈里的元素。可以选择数组:
var items = []
  1. 为我们的栈声明一些方法
push(element(s)) : 添加一个或几个新元素到栈顶
pop() : 移除栈顶的元素, 同时返回被移除的元素
peek() : 返回栈顶的元素, 不对栈做任何修改
isEmpty() : 如果栈里没有任何元素就返回 true, 否则返回 false 
clear() : 移除栈里所有的元素
size() : 返回栈里的元素个数, 和数组的 length 很相似
  • 实现 push, 该方法只添加元素到栈顶,也就是栈的末尾
this.push = function(element) {
  items.push(element)
}
  • pop 方法,这个方法主要用来移除栈里的元素。栈遵从LIFO原则,因此移出的是最后添加进去的元素
this.pop = function() {
  return items.pop()
}
  • 想知道栈里最后添加的元素是什么,可以用peek方法。这个方法将返回栈顶的元素
this.peek = function() {
  return items[items.length - 1]
}
包含三个元素的栈,最后一个 length - 1

]

  • isEmpty ,如果栈为空的话将返回 true ,否则就返回 false
this.isEmpty = function() {
  return items.length === 0
}
  • 类似于数组的 length 属性,我们也能实现栈的 length 。对于集合,最好用 size 代替 length 。因为栈的内部使用数组保存元素,所以能简单地返回栈的长度
this.size = function () {
  return items.length
}
  • clear 方法用来移除栈里所有的元素,把栈清空
this.clear = function () {
  items = []
}
  • 为了检查栈里的内容,我们来实现一个辅助方法,叫 print 。它会把栈里的元素都输出到控制台
this.print = function () {
  console.log(items.toString())
}
  • 上面我们就创建了栈,全部代码
function Stack () {

  let items = []

  this.push = function (elements) {
     items.push(elements)
  }

  this.pop = function () {
    return items.pop()
  }

  this.peek = function () {
    return items[items.length - 1]
  }

  this.isEmpty = function () {
    return items.length === 0
  }

  this.size = function () {
    return items.length
  }

  this.clear = function () {
    items = []
  }

  this.print = function () {
    console.log(items.toString())
  }

}
  1. 使用Stack
1. 初始化 Stack 类
let stack = new Stack()

stack.isEmpty()  // true

stack.push(5)
stack.push(8)

stack.peek()  // 8
stack.print()  // 5, 8

stack.push(11)
stack.size()  // 3

stack.isEmpty()  // false

stack.push(15)
对栈的操作
stack.pop()
stack.pop()

stack.print()  // 5,8
去元素的过程

从十进制到二进制

要把十进制转化成二进制,我们可以将该十进制数字和2整除(二进制是满二进一),直到结
果是0为止

二进制
// javaScript有数字类型,但是它不会区分究竟是整数还是浮点数。因此,要使用 Math.floor 函数让除法的操作仅返回整数部分
function divideBy2 (decNumber) {
  var remStack = new Stack(),
      rem,
      binaryString = ''
  
  // 满足和2做整除的条件
  while (decNumber > 0) {
    // 当前结果和2的余数,放到栈里
    rem = Math.floor(decNumber % 2)
    remStack.push(rem)
    // 让结果和2做整除
    decNumber = Math.floor(decNumber / 2)
  }
  // pop 方法把栈中的元素都移除,把出栈的元素变成连接成字符串
  while (!remStack.isEmpty()) {
    binaryString += remStack.pop().toString()
  }
  return binaryString
}

console.log(divideBy2(233))  // "11101001"

十进制转成二进制时,余数是0或1;在将十进制转成八进制时,余数是0到8之间的数;但是将十进制转成16进制时,余数是0到8之间的数字加上A、B、C、D、E和F(对应10、11、12、13、14和15)。因此,我们需要对栈中的数字做个转化才可以(行{1} 和行 {2})

// 能把十进制转换成任何进制
function baseConverter(decNumber, base){
  var remStack = new Stack(),
      rem,
      baseString = '',
      digits = '0123456789ABCDEF'; //{1} 
  while (decNumber > 0){
    rem = Math.floor(decNumber % base);
    remStack.push(rem);
    decNumber = Math.floor(decNumber / base);
  } 
  while (!remStack.isEmpty()){
    baseString += digits[remStack.pop()]; //{2}
  }
  return baseString;
}

回文

使用栈,可以轻松判断一个字符串是否是回文。我们将拿到的字符串的每个字符按从左至右的顺序压入栈。当字符串中的字符都入栈后,栈内就保存了一个反转后的字符串,最后的字符在栈顶,第一个字符在栈底

function isPalindrome(word) {
  var s = new Stack()
  for(var i = 0; i < word.length; i++) {
    s.push(word[i])
  }
  var rword = ''
  while (s.size() > 0) {
    rword += s.pop()
  }
  return word === rword ? true : false
}

console.log(isPalindrome('12321'))  // true
console.log(isPalindrome('abcdcba'))  // true
console.log(isPalindrome('1236361'))  // false

相关文章

  • Android面试题总结(题目+复习链接)

    数据结构 1.栈实现原理 java数据结构与算法之栈(Stack)设计与实现 - CSDN博客 2.链表实现原理 ...

  • 数据结构之栈 原理 栈是一种比较常见的数据结构,它的操作可以看做是数组的子集,因为栈只能从栈顶取元素和添加元素,并...

  • 数据结构之---栈

    数据结构之---栈 顺序栈 内部采用数组实现 结构图; 定义结构体: 函数声明 进栈以及出栈 图示: 其余操作 链...

  • Activity启动模式精讲

    讲解本技术点之前需要准备的技术点回顾 栈数据结构 数据结构图文解析之:栈的简介及C++模板实现 - melonst...

  • 数据结构之栈的链式存储结构

    之前写了栈的顺序存储结构,对栈的定义和操作进行了说明 数据结构之栈的顺序存储结构 现在接着写栈的链式存储结构 栈的...

  • 栈和队列

    1、栈 栈是一种先进先出的数据结构。栈顶进栈,栈顶出栈。 数据结构 栈的初始化 进栈 出栈 栈的最小值 2、队列 ...

  • Java 基础 35 数据结构和ArrayList集合的相关案例

    1.1 数据结构 什么是数据结构?数据的组织方式.维基百科 1.1.1 常见数据结构之栈和队列 1.1.2常见数据...

  • 实战PHP数据结构基础之栈

    栈和队列 栈和队列和之前讲到的实战PHP数据结构基础之双链表 一样都是线性结构。 栈有什么特点 栈遵循后进先出的原...

  • 004 go语言实现栈

    1 数据结构 数据结构: 要实现的功能:0 栈的初始化1 获取栈长度2 入栈3 出栈4 清空栈内容5 判断栈是否为...

  • java高级知识点

    1.数据结构 程序=数据结构+算法 栈:后进先出,线性结构 入栈:push 出栈:pop假如已知入栈顺序是ab...

网友评论

    本文标题:数据结构之栈

    本文链接:https://www.haomeiwen.com/subject/cbtlvqtx.html