03-2 栈_题解

栈题目练习

标题末尾序号对应Leedcode题序,解题思路在上篇已提到,这里为具体代码实现,使用JavaScript

1. 有效的括号 20

var isValid = function(s) {
    var arr_stack = [];

    for (var i = 0; i<s.length;i++) {
        var item = s[i];

        if (item === '(' || item === '[' || item === '{') {
            arr_stack.push(item);
        }else{
            var compose_item = arr_stack.pop();
            if (compose_item === '(' && item === ')' || compose_item === '[' && item === ']' ||compose_item === '{' && item === '}' ) {
                continue;
            }
            return false;
        }
    }
    if (arr_stack.length !==0){
        return false;
    }
    return true;
};

2. 最小栈 155

var MinStack = function() {
    this.stackdata = [];
    this.mindata = [];
    this.count = 0;
};

/** 
 * @param {number} val
 * @return {void}
 */
MinStack.prototype.push = function(val) {
    var min = this.mindata[this.count - 1];
    this.stackdata.push(val);
    this.mindata.push(min !== undefined ? (min > val ? val : min) : val);
    this.count++;
};

/**
 * @return {void}
 */
MinStack.prototype.pop = function() {
    if (this.count === 0) return null;
    this.count--;
    this.stackdata.pop();
    this.mindata.pop();
};

/**
 * @return {number}
 */
MinStack.prototype.top = function() {
    if (this.count === 0) return null;
    return this.stackdata[this.count - 1];
};

/**
 * @return {number}
 */
MinStack.prototype.getMin = function() {
    if (this.count === 0) return null;
    return this.mindata[this.count - 1];
};

3. 用栈实现队列 232

var MyQueue = function() {
    this.instack = [];
    this.outstack = [];
};

/**
 * Push element x to the back of queue. 
 * @param {number} x
 * @return {void}
 */
MyQueue.prototype.push = function(x) {
    this.instack.push(x);
};

/**
 * Removes the element from in front of queue and returns that element.
 * @return {number}
 */
MyQueue.prototype.pop = function() {
    if(!this.outstack.length) {
        this.enterdata();
    }
    return this.outstack.pop();
};

/**
 * Get the front element.
 * @return {number}
 */
MyQueue.prototype.peek = function() {
    if(!this.outstack.length) {
        this.enterdata();
    }
    return this.outstack[this.outstack.length - 1];
};

/**
 * Returns whether the queue is empty.
 * @return {boolean}
 */
MyQueue.prototype.empty = function() {
    return this.instack.length === 0 && this.outstack.length === 0;
};

MyQueue.prototype.enterdata = function() {
    while(this.instack.length) {
        this.outstack.push(this.instack.pop());
    }
}

4. 比较含退格的字串 844

var backspaceCompare = function(s, t) {
   return getstr(s) === getstr(t);
};

var getstr = function(str) {
    var stack = [];

    for (var i = 0; i < str.length; i++) {
        if (str[i] === '#') {
            stack.pop();
        }else{
            stack.push(str[i]);
        }
    }
    return stack.join('');
}

5. 基本计算器 224

var calculate = function(s) {
    var numstack = [];
    var markstack = [];
    var result = 0;

    for (var i = 0; i < s.length; i++) {
        if (s[i] === ' ') continue;
        if (s[i] === ')') {
            while(markstack[markstack.length-1] !== '(') {
                result += (computed(numstack.pop(),numstack.pop(),markstack.pop()))
            }
            markstack.pop();
            numstack.push(result);
        }
        if (isNaN(Number(s[i]))) {
            markstack.push(s[i]);
        }else{
            numstack.push(Number(s[i]));
        }
    }
    while(markstack.length) {
         result += (computed(numstack.pop(),numstack.pop(),markstack.pop()))
    }
    return result;
};

var computed = function(num1,num2,mark) {
    var result = 0;
    switch (mark) {
        case '+':
            result = num1 + num2;
            break;
        case '-':
            result = num1 - num2;
            break;
        default:
            break;
    }
    return result;
}

6. 棒球比赛 682

var calPoints = function (ops) {
    var arr = [];
    var result = 0;

    for (var index = 0; index < ops.length; index++) {
        var item = ops[index];

        if (isNaN(Number(item))) {
            var len = arr.length;

            if (item === "+" && len > 1) {
                arr.push(arr[len-1]+arr[len-2]);
            }
            if (item === "D" && len > 0) {
                arr.push(arr[len-1]*2);
            }
            if (item === "C" && len >0 ){
                arr.pop();
            }
        }else{{
            arr.push(Number(item));
        }}
    }
    while(arr.length) {
        result += arr.pop();
    }
    return result;
}

7. 下一个更大元素 496

暴力解法:

var nextGreaterElement = function(nums1, nums2) {
    var result = [];

    for (var idx = 0; idx < nums1.length; idx++){
        result.push(compare(nums1[idx],nums2));
    }
    return result;
};

var compare = function (num,nums){
    var flag = false;

    for (var i = 0; i< nums.length; i++) {
        var item = nums[i];

        if (num === item){
            flag = true;
            continue;
        }
        if (flag && num < item) {
            return item;
        }
    }
    return -1;
}

单调栈解法:

var nextGreaterElement2 = function(num1, num2) {
    var stack = [];
    var map = new Map();
    var result =[];

    num2.forEach(element => {
        while(stack.length && stack[stack.length-1]<element){
            map.set(stack.pop(),element);
        }
        stack.push(element);
    });
    stack.forEach(element => {
        map.set(element,-1);
    });
    num1.forEach(element => {
        result.push(map.get(element))
    });
    return result;
};
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数据结构与算法之美 - 学习笔记 引出问题:浏览器如何实现前进后退功能[图片上传失败...(image-56f9b...
    月帝阅读 412评论 0 0
  • 20、有效的括号给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。 有...
    BigBigFlower阅读 506评论 0 0
  • 496-下一个更大元素 由于两个向量中所有元素都是不重复的,因此本题可以采取栈+哈希表来进行。抛开nums1不谈,...
    nowherespyfly阅读 143评论 0 1
  • 这里是力扣简单题的方案解析及python实现,有关中等和困难题目,请移步: 简单题(已完成,完善中)中等题(更新中...
    玖月晴阅读 14,448评论 0 16
  • 1. file n. 文件;v. 保存文件2. command n. 命令指令3. use v. 使用用途4. p...
    喵呜Yuri阅读 773评论 0 4