从零学习数据结构(2)- 关于栈结构的相关练习

146 阅读2分钟

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

前言

接上篇文章,认识了数据结构和算法的基本概念和栈的基础结构,接下来就对栈结构进行一定的练习,并用数组结构来实现一个栈。

栈结构面试题

  • 有六个元素 6、5、4、3、2、1 的顺序进栈,问下列哪一个不是合法的出栈顺序:C

A、5 4 3 6 1 2

B、4 5 3 2 1 6

C、3 4 6 5 2 1

D、2 3 4 1 5 6

解释: A - 压入6,压入5,弹出5,压入4,弹出4,压入3,弹出3弹出6,再压入2,1,先弹出1,再弹出2,正确

B - 压入6、5、4,弹出4弹出5,压入3,弹出3、压入2,弹出2,压入1,弹出1弹出6,正确

C - 压入6、5、4、3,弹出3弹出4,然后要弹出就只能先弹出5,在弹出6,与3、4、6、5的顺序不符,因此 C 不合法

D - 压入6、5、4、3、2,弹出2弹出3弹出4,压入1,弹出1弹出5弹出6,正确

栈结构的实现

栈的常见操作:

  • push:添加一个新元素到栈顶

  • pop:移除栈顶的元素,同时返回这个元素

  • peek:返回栈顶的元素,但并不会弹栈

  • isEmpty:判断这个栈中是否为空

  • size:返回栈里的元素个数

  • toString:将栈结构的内容以字符串的形式返回

代码:

class Stack {
  items = []
  push(element){
    this.items.push(element)
  }
  pop(){
    return this.items.pop()
  }
  peek(){
    return this.items[this.items.length - 1]
  }
  isEmpty(){
    return this.items.length === 0
  }
  size(){
    return this.items.length
  }
  toString(){
    return this.items.join('')
  }
}

测试代码:

const stack = new Stack()
stack.items = ['a', 'b', 'c', 'd']
console.log(stack.push(8))
console.log(stack.items) //['a', 'b', 'c', 'd', 8]
console.log(stack.peek()) // 8
console.log(stack.pop()) // 8
console.log(stack.items) //['a', 'b', 'c', 'd']
console.log(stack.isEmpty()) //false
console.log(stack.size()) // 4
console.log(stack.toString()) //'abcd'

栈 - 十进制转二进制

为什么要十进制转二进制?

  • 现实生活中,主要使用十进制

  • 但在计算科学中,二进制非常重要,因为计算机里所有内容都是用二进制数字表示的(0和1)

  • 没有十进制和二进制相互转化的能力,与计算机交流就很困难

如何实现十进制转二进制

  • 我们可以将十进制数字和2整除(二进制是满 2 进 1),直到结果是 0 为止,再把结果组合起来,再取反

  • 例如:

10/2  ----- 0

5/2   -----  1

2/2   ----- 0

1/2   ------ 1

结果就是:1010

实现一个 十进制转二进制函数


const Stack = require('./stack-demo')

function decTobin(decNumber) {
  const stack = new Stack()

  while (decNumber > 0) {
    stack.push(decNumber % 2)
    decNumber = Math.floor(decNumber / 2)
  }
  return stack.items.reverse().join('')
}