【算法训练营】–》读懂 数据结构——栈

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 【算法训练营】–》读懂 数据结构——栈,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

​​🍈作者简介:大家好,我是亦世凡华、渴望知识储备自己的一名在校大学生

🍇个人主页:亦世凡华、

🍓系列专栏:算法训练营

🥝没有引发任何行动的思想都不是思想而是梦想。

目录

什么是栈?

栈【模板】

栈的压入、弹出系列

有效括号序列

逆波兰表达式求值

点击消除

表达式求值


什么是栈?

栈(stack)又名堆栈,它是一种运算受限的线性表。限定权在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

栈【模板】

push x:将 加x x\ x 入栈,保证 x x\ x 为 int 型整数。

pop:输出栈顶,并让栈顶出栈

top:输出栈顶,栈顶不出栈

输入描述:

第一行为一个正整数 n n\ n ,代表操作次数。(1≤n≤100000)(1 \leq n \leq 100000)(1≤n≤100000)

接下来的 n n\ n ,每行为一个字符串,代表一个操作。保证操作是题目描述中三种中的一种。

输出描述:

如果操作为push,则不输出任何东西。

如果为另外两种,若栈为空,则输出 “error“

否则按对应操作输出。

let stack = [];
let top = -1;
while ((line = readline())) {
  var arr = line.split(" ");
  // 将循环的次数跳过  
  if (!isNaN(parseInt(arr[0]))) {
    continue;
  }
  if (arr.length === 2) {
    stack[++top] = arr[1];
  } else if (arr[0] === "pop") {
    if (top === -1) {
      console.log("error");
    } else {
      console.log(stack[top--]);
    }
  } else {
    if (top === -1) {
      console.log("error");
    } else {
      console.log(stack[top]);
    }
  }
}

栈的压入、弹出系列

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

1. 0<=pushV.length == popV.length <=1000

2. -1000<=pushV[i]<=1000

3. pushV 的所有数字均不相同

示例:

输入:[1,2,3,4,5],[4,5,2,3,1]

返回:true

说明:可以通过

push(1)=>push(2)=>(3)=>push(4)=>pop()=>push(5)=>pop()=>pop()=>pop()=>pop()

这样的顺序得到[4,5,3,2,1]这个序列,返回true。

function IsPopOrder(pushV, popV)
{
    // write code here
    let stack = []
    for (let node of pushV){
        stack.push(node);
        while (stack[stack.length - 1] === popV[0]){
            stack.pop();
            popV.shift();
            if (popV.length === 0) return true;
        }
    }
     
    while (stack.pop() === popV.shift()){
        if (popV.length === 0) return true;
    };
     
    return false;
}
module.exports = {
    IsPopOrder : IsPopOrder
};

有效括号序列

给出一个仅包含字符'(‘,’)’,'{‘,’}’,'[‘和’]’,的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,”()”和”()[]{}”都是合法的括号序列,但”(]”和”([)]”不合法。

数据范围:字符串长度 0≤n≤100000\le n \le 100000≤n≤10000

要求:空间复杂度 O(n)O(n)O(n),时间复杂度 O(n)O(n)O(n)

示例:

输入:”()[]{}”

返回值:true

/**
  * 
  * @param s string字符串 
  * @return bool布尔型
  */
function isValid( s ) {
    // write code here
    const truely = ["()","[]","{}"]
     
    function check() {  
        const checkList = truely.filter( item => {
            return s.indexOf( item ) > -1
        })
         
        return checkList.length
    }
     
    while(  check() > 0 ) {
        truely.forEach( item => {
            s = s.replace( item, "" )
        })
    }
     
    if( s.length > 0 ) {
        return false
    }else {
        return true
    }
}
module.exports = {
    isValid : isValid
};

逆波兰表达式求值

给定一个逆波兰表达式,求表达式的值。

数据范围:表达式长度满足 1≤n≤104 1 \le n \le 10^4 \ 1≤n≤104  ,表达式中仅包含数字和 + ,- , * , / ,其中数字的大小满足 ∣val∣≤200 |val| \le 200 \ ∣val∣≤200 。

示例:

输入:[“2″,”1″,”+”,”4″,”*”]

返回值:12

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param tokens string字符串一维数组 
 * @return int整型
 */
function evalRPN( tokens ) {
    // write code here
    var stack = [];
    for (let i = 0;i<tokens.length;i++)
        {
            if(tokens[i]!=='+'&&
              tokens[i]!=='-' &&
              tokens[i]!=='*' &&
              tokens[i]!=='/')
            stack.push(parseInt(tokens[i]));
            else {
                let b = stack.pop()
                let a = stack.pop()
                switch(tokens[i]){
                    case '+' :
                        stack.push(a+b)
                        break
                    case '-':
                        stack.push(a-b)
                        break
                    case '*':
                        stack.push(a*b)
                        break
                    case '/':
                        stack.push(parseInt(a/b))
                        break
                }
            }
             
        }
    return stack.pop();
}
module.exports = {
    evalRPN : evalRPN
};

点击消除

牛牛拿到了一个字符串。
他每次“点击”,可以把字符串中相邻两个相同字母消除,例如,字符串”abbc”点击后可以生成”ac”。
但相同而不相邻、不相同的相邻字母都是不可以被消除的。
牛牛想把字符串变得尽可能短。他想知道,当他点击了足够多次之后,字符串的最终形态是什么?

输入描述:

一个字符串,仅由小写字母组成。(字符串长度不大于300000)

输出描述:

一个字符串,为“点击消除”后的最终形态。若最终的字符串为空串,则输出0。

示例:

输入:abbc

输出:ac

const str = readline();
const inarr = str.split("");
const arr = [];
for( let i = 0, l = inarr.length; i < l; i++ ) {
    const item = inarr[i];
    if( i > 0 && item === arr[arr.length - 1] ) {
        arr.pop()
    }else {
        arr.push( item )
    }
}
if( arr.length > 0 ) {
    print(arr.join(""))
}else {
    print(0)
}

表达式求值

请写一个整数计算器,支持加减乘三种运算和括号。

数据范围:0≤∣s∣≤1000\le |s| \le 1000≤∣s∣≤100,保证计算结果始终在整型范围内

要求:空间复杂度: O(n)O(n)O(n),时间复杂度 O(n)O(n)O(n)

示例:

输入:”1+2″

输出:3

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 返回表达式的值
 * @param s string字符串 待计算的表达式
 * @return int整型
 */
function solve( s ) {
    // write code here
    return eval(s)
}
module.exports = {
    solve : solve
};

活动地址:CSDN21天学习挑战赛

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/140085.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!