数据结构-栈

最近复习了一遍数据结构,记录学习内容。


什么是栈?

栈是一种遵循**后进先出(LIFO)**原则的有序集合。栈的两端分别叫做:栈顶栈底。最先入栈的元素被压入栈底,新添加的元素会保持在栈顶。在栈中,越先入栈的元素越接近栈底,越后入栈的元素越靠近栈顶。

这个结构类似于一个水桶,先放进去的东西被压在下面,而后放进去的东西反而在顶部,是最先被拿出来的。

请添加图片描述

这里A先入栈,一定是最后出栈的,F最后入栈,处于栈顶,一定最先出栈。


创建一个栈

(这里没有考虑私有属性)

class Stack {
    constructor() {
            //存如栈的元素以键值对的形式保存到_items中
            this._items = {}
            this._count = 0
        }
    
    //方法...
}

push(element)方法,向栈中压入元素

Stack.prototype.push = function(element) {
    //元素存入items对象中,_count为键,值为element,存储之后count+1表示长度
    this._items[this._count++] = element
}

size()方法,返回栈的大小

Stack.prototype.size = function() {
    return this._count
}

isEmpty()方法,判断栈是否为空,为空则返回true否则返回false

Stack.prototype.isEmpty = function() {
    //长度为0返回false
    return this._count === 0
}

pop()方法,移除栈顶元素,并返回移除的元素

Stack.prototype.pop = function() {
    if (this.isEmpty()) {
        return undefined
    }
    this._count--
        const result = this._items[this._count]
    delete this._items[this._count]
    return result
}

peak()方法,该方法会返回栈顶元素,用来查看栈顶元素

Stack.prototype.peak = function() {
    if (this.isEmpty()) {
        return undefined
    }
    return this._items[this._count - 1]
}

clear()方法,清空栈

Stack.prototype.clear = function() {
    this._items = {}
    this._count = 0
}

toString()方法,返回栈内容的字符串形式

Stack.prototype.toString = function() {
    if (this.isEmpty()) {
        return ''
    }
    let result = this._items[0]
    for (let i = 1; i < this._count; i++) {
        result += "," + this._items[i]
    }
    return result
}

用栈来解决问题

进制转换算法

可以将指定数字转换成任意进制的数字,比如将指定数字10转换成2进制数字:

请添加图片描述

function decimalToBinary(decNumber) {
    let stack = new Stack()
    let num = decNumber
        //保存余数
    let rem = 0
    while (num > 0) {
        rem = Math.floor(num % 2)
        stack.push(rem)
        //保存商,下一轮还要用商继续除
        num = Math.floor(num / 2)
    }
    let result = ''
    let len = stack.size()
    for (let i = 0; i < len; i++) {
        result += stack.pop()
    }
    return result
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值