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;
};
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容

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