算法实现之栈排序

题目

栈排序。 编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:push、pop、peek 和 isEmpty。当栈为空时,peek 返回 -1。

示例1

输入:
["SortedStack", "push", "push", "peek", "pop", "peek"]
[[], [1], [2], [], [], []]
输出:
[null,null,null,1,null,2]

示例2

输入:
["SortedStack", "pop", "pop", "push", "pop", "isEmpty"]
[[], [], [], [1], [], []]
输出:
[null,null,null,null,null,true]

题目解析

栈排序,即对栈进行排序使最小元素位于栈顶
那我们只需要考虑入栈时,最小的元素永远在栈顶即可,
    这里我们就需要在添加元素入栈的时候进行判断
        1、新入栈的元素值比栈顶的元素值小或者说此时就是一个空栈,我们只需要添加入栈即可
        2、如果不是一个空栈并且新添加的元素值比栈顶元素值大,我们就需要删除栈顶元素并缓存栈顶元素值,添加新入的元素,最后再添加缓存的栈顶元素
点击查看代码
var SortedStack = function() {
    this.stack = []
};

/** 
 * @param {number} val
 * @return {void}
 */
SortedStack.prototype.push = function(val) {
	//新添加的元素值小于栈顶值,或者是空栈时,那它就是最小值,就是栈顶值
    if (val < this.peek() || this.isEmpty()) {
        this.stack.push(val)
    } else {
	// 新入的值比栈顶值大时,缓存栈顶值并删除,添加新元素入栈,最后再添加缓存的栈顶值入栈
        let min = this.stack.pop()
        this.push(val)
        this.stack.push(min)
    }
};

/**
 * @return {void}
 */
SortedStack.prototype.pop = function() {
    return this.stack.pop()
};

/**
 * @return {number}
 */
SortedStack.prototype.peek = function() {
    return this.stack[this.stack.length - 1] ?? -1
};

/**
 * @return {boolean}
 */
SortedStack.prototype.isEmpty = function() {
    return this.stack.length > 0 ? false : true
};

posted @ 2022-09-12 15:50  卖萌实习生  阅读(141)  评论(0)    收藏  举报