什么是栈?
栈(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“否则按对应操作输出。
letstack= []; lettop=-1; while ((line=readline())) { vararr=line.split(" "); // 将循环的次数跳过 if (!isNaN(parseInt(arr[0]))) { continue; } if (arr.length===2) { stack[++top] =arr[1]; } elseif (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。
functionIsPopOrder(pushV, popV) { // write code hereletstack= [] for (letnodeofpushV){ stack.push(node); while (stack[stack.length-1] ===popV[0]){ stack.pop(); popV.shift(); if (popV.length===0) returntrue; } } while (stack.pop() ===popV.shift()){ if (popV.length===0) returntrue; }; returnfalse; } 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布尔型 */functionisValid( s ) { // write code hereconsttruely= ["()","[]","{}"] functioncheck() { constcheckList=truely.filter( item=> { returns.indexOf( item ) >-1 }) returncheckList.length } while( check() >0 ) { truely.forEach( item=> { s=s.replace( item, "" ) }) } if( s.length>0 ) { returnfalse }else { returntrue } } 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整型 */functionevalRPN( tokens ) { // write code herevarstack= []; for (leti=0;i<tokens.length;i++) { if(tokens[i]!=='+'&&tokens[i]!=='-'&&tokens[i]!=='*'&&tokens[i]!=='/') stack.push(parseInt(tokens[i])); else { letb=stack.pop() leta=stack.pop() switch(tokens[i]){ case'+' : stack.push(a+b) breakcase'-': stack.push(a-b) breakcase'*': stack.push(a*b) breakcase'/': stack.push(parseInt(a/b)) break } } } returnstack.pop(); } module.exports= { evalRPN : evalRPN};
点击消除
牛牛拿到了一个字符串。
他每次“点击”,可以把字符串中相邻两个相同字母消除,例如,字符串"abbc"点击后可以生成"ac"。
但相同而不相邻、不相同的相邻字母都是不可以被消除的。
牛牛想把字符串变得尽可能短。他想知道,当他点击了足够多次之后,字符串的最终形态是什么?
输入描述:
一个字符串,仅由小写字母组成。(字符串长度不大于300000)
输出描述:
一个字符串,为“点击消除”后的最终形态。若最终的字符串为空串,则输出0。
示例:
输入:abbc
输出:ac
conststr=readline(); constinarr=str.split(""); constarr= []; for( leti=0, l=inarr.length; i<l; i++ ) { constitem=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整型 */functionsolve( s ) { // write code herereturneval(s) } module.exports= { solve : solve};