【PHP解法==LeetCode栈类型】71.简化路径 && 150.逆波兰表达式求值

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010365335/article/details/86777515

目录

71.简化路径

150.逆波兰表达式求值


栈类型还有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//b////c/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];                        //最终栈中只会剩下一个元素,将该元素弹出即可
    }
}

猜你喜欢

转载自blog.csdn.net/u010365335/article/details/86777515
今日推荐