目录
栈类型还有LeetCode 20.有效的括号等题
71.简化路径
以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。
在 Unix 风格的文件系统中,一个点(.
)表示当前目录本身;此外,两个点 (..
) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。
请注意,返回的规范路径必须始终以斜杠 /
开头,并且两个目录名之间必须只有一个斜杠 /
。最后一个目录名(如果存在)不能以 /
结尾。此外,规范路径必须是表示绝对路径的最短字符串。
示例 1:
输入:"/home/" 输出:"/home" 解释:注意,最后一个目录名后面没有斜杠。
示例 2:
输入:"/../" 输出:"/" 解释:从根目录向上一级是不可行的,因为根是你可以到达的最高级。
示例 3:
输入:"/home//foo/" 输出:"/home/foo" 解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。
示例 4:
输入:"/a/./b/../../c/" 输出:"/c"
示例 5:
输入:"/a/../../b/../c//.//" 输出:"/c"
示例 6:
输入:"/a//bc/d//././/.." 输出:"/a/b/c"
解法:
(1)将数组分割,只去分析有值的元素
(2)对特殊值进行特殊操作,'.':跳过,'..':出栈,其余的进栈
(3)用‘/’,连接结果数组
class Solution {
function simplifyPath($path) {
//栈
$path = explode('/', $path); //分割字符串
$realPath = []; //保存结果路径
foreach ($path as $v) {
if($v){ //只去分析有值的元素
if($v == '.') //为当前路径,不做操作
continue;
elseif($v == '..') //为上一目录,结果数组出栈
array_pop($realPath);
else
$realPath[] = $v; //进栈
}
}
return '/'.implode('/',$realPath);
}
}
150.逆波兰表达式求值
根据逆波兰表示法,求表达式的值。
有效的运算符包括 +
, -
, *
, /
。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:
- 整数除法只保留整数部分。
- 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
示例 1:
输入: ["2", "1", "+", "3", "*"] 输出: 9 解释: ((2 + 1) * 3) = 9示例 2:
输入: ["4", "13", "5", "/", "+"] 输出: 6 解释: (4 + (13 / 5)) = 6示例 3:
输入: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"] 输出: 22 解释: ((10 * (6 / ((9 + 3) * -11))) + 17) + 5 = ((10 * (6 / (12 * -11))) + 17) + 5 = ((10 * (6 / -132)) + 17) + 5 = ((10 * 0) + 17) + 5 = (0 + 17) + 5 = 17 + 5 = 22
解法:
(1)遍历数组,将数字压入栈中,运算符则进行运算
(2)若遍历到的值是运算符时,则弹出栈中的头两个元素进行运算,将运算完的结果再压回栈中
(3)遍历完之后,结果栈中只会剩下一个元素,返回$nums[0]即可
class Solution {
function evalRPN($tokens) {
//栈
$nums = []; //初始化结果栈中
foreach ($tokens as $v) { //遍历数组
if(is_numeric($v)){ //将数字的元素压入栈中
$nums[] = $v;
}else{ //当值是运算符时,弹出栈中的两个元素进行运算
$num1 = array_pop($nums);
$num2 = array_pop($nums);
switch ($v) {
case '+':
$res = $num1 + $num2;
break;
case '-':
$res = $num2 - $num1;
break;
case '*':
$res = $num1 * $num2;
break;
case '/':
$res = $num2 / $num1; //当相除后大于0,则向下取整;小于0,则向上取整
if($res > 0) {
$res = floor($res);
}else{
$res = ceil($res);
}
break;
}
$nums[] = $res; //将结果重新压回栈中
}
}
return $nums[0]; //最终栈中只会剩下一个元素,将该元素弹出即可
}
}