ext-1.栈的最小值

/**
 * 请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)。
 * initialize your data structure here.
 */
/**
 * 解题思路:
 * 1.定义两个栈,一个栈用于存储数据,另一个栈用于存储每次数据进栈时栈的最小值.
 * 2.每次数据进栈时,将此数据和最小值栈的栈顶元素比较,将二者比较的较小值再次存入最小值栈.
 * 3.数据栈出栈,最小值栈也出栈。
 * 4.这样最小值栈的栈顶永远是当前栈的最小值
 */
var MinStack = function() {
    this.dataStack = [] // 用于储存数据
    this.minStack = [] // 用于储存最小值,注意这两个stack的长度是一样的
};

/** 
 * @param {number} x
 * @return {void}
 */
MinStack.prototype.push = function(x) {
    this.dataStack.push(x)
    // 每次进栈数据都与之前的min比较
    let min = this.getMin()
    if(x < min || this.minStack.length === 0) {
        this.minStack.push(x)
    } else {
        this.minStack.push(min) // 注意理解这一步
    }
};

/**
 * @return {void}
 */
MinStack.prototype.pop = function() {
    this.minStack.pop() // 注意理解这一步
    return this.dataStack.pop()
};

/**
 * @return {number}
 */
MinStack.prototype.top = function() {
    return this.dataStack[this.dataStack.length - 1]
};

/**
 * @return {number}
 */
MinStack.prototype.getMin = function() {
    let min = this.minStack[this.minStack.length - 1]
    return min
};

/**
 * Your MinStack object will be instantiated and called as such:
 * var obj = new MinStack()
 * obj.push(x)
 * obj.pop()
 * var param_3 = obj.top()
 * var param_4 = obj.getMin()
 */