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

简介: 读懂 数据结构——栈

什么是栈?

栈(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};


相关文章
|
16天前
|
消息中间件 存储 搜索推荐
深入理解栈和队列(二):队列
深入理解栈和队列(二):队列
29 0
|
17天前
|
存储 算法 索引
【算法与数据结构】队列的实现详解
【算法与数据结构】队列的实现详解
|
21天前
|
算法
【算法与数据结构】二叉树(前中后)序遍历2
【算法与数据结构】二叉树(前中后)序遍历
|
9天前
|
存储 算法 调度
数据结构期末复习(3)栈和队列
数据结构期末复习(3)栈和队列
17 0
|
9天前
|
存储 机器学习/深度学习 算法
上机实验三 图的最小生成树算法设计 西安石油大学数据结构
上机实验三 图的最小生成树算法设计 西安石油大学数据结构
18 1
|
17天前
|
算法 索引
【算法与数据结构】深入二叉树实现超详解(全源码优化)
【算法与数据结构】深入二叉树实现超详解(全源码优化)
|
17天前
|
存储 算法
【算法与数据结构】深入解析二叉树(二)之堆结构实现
【算法与数据结构】深入解析二叉树(二)之堆结构实现
|
21天前
|
算法 C语言
【算法与数据结构】 C语言实现单链表队列详解2
【算法与数据结构】 C语言实现单链表队列详解
|
21天前
|
存储 算法 C语言
【算法与数据结构】 C语言实现单链表队列详解1
【算法与数据结构】 C语言实现单链表队列详解
|
1月前
【栈】数据结构栈的实现
【栈】数据结构栈的实现