力扣第9天----第20题、第1047题、第150题

力扣第9天----第20题、第1047题、第150题

文章目录

  • 力扣第9天----第20题、第1047题、第150题
  • 一、第20题--有效的括号
  • 二、第1047题--删除字符串中的所有相邻重复项
  • 三、第150题--逆波兰表达式求值

一、第20题–有效的括号

相邻字符、能够配上对的字符这些字符消除的问题用栈去做。加入一些去重、等环节,使得方法可排除掉一些情况。

class Solution {
public:
    bool isValid(string s) {
        stack mystack;
        if (s.size() %2 ==1)   // 去重
            return false;

        for (int i =0 ; i

二、第1047题–删除字符串中的所有相邻重复项

​ 跟上一题思路类似----相邻、配对的字符,消除的问题。这里使用sting result代替stack,也可以实现,同时最后结果不用反转,直接输出就可以;如果用stack,结果跟出栈顺序反着来。这说明stack是一种思想,可手动维护vector、list实现stack的LIFO特点,同时保留了vector、list等的其他功能。这里string其实,就跟vector差不多。

class Solution {
public:
    string removeDuplicates(string s) {
        string result;
        for (int i = 0; i< s.size(); i++){
            if (result.empty() || s[i] != result.back())  //要判断下是否为空,如果空的话,back()会报错。
                result.push_back(s[i]);
            else
                result.pop_back();
        }
        return result;
    }
};

​ 另外,debug时碰到个插曲。不加result.empty(),在compiler explorer上就没问题,在LeetCode上就报错。**可能是,compiler explorer编译器会帮助做一些补全;而LeetCode编译器,不会帮助做这些,考查更严谨一些。**嗯,LeetCode这些题,在内存边界上还是要小心,尽量多的加一些保障,即使可能在现代编译器中,这都不是问题。
没有报错
力扣第9天----第20题、第1047题、第150题_第1张图片
也能进行判断
力扣第9天----第20题、第1047题、第150题_第2张图片

三、第150题–逆波兰表达式求值

​ 跟前两题思路一样的,写的有些冗余,不想改了。

class Solution {
public:
    int evalRPN(vector& tokens) {
        stack mystack;
        for(string t : tokens){
            if(t == "+"){
                int num_2 = mystack.top();     //注意,pop的返回值是void,top的返回值才是栈元素。
                mystack.pop();
                int num_1 = mystack.top();
                mystack.pop();
                mystack.push(num_1 + num_2);
            }
            else if(t == "-"){
                int num_2 = mystack.top();
                mystack.pop();
                int num_1 = mystack.top();
                mystack.pop();
                mystack.push(num_1 - num_2);
            }
            else if(t == "*"){
                int num_2 = mystack.top();
                mystack.pop();
                int num_1 = mystack.top();
                mystack.pop();
                mystack.push(num_1 * num_2);
            }            
            else if(t == "/"){
                int num_2 = mystack.top();
                mystack.pop();
                int num_1 = mystack.top();
                mystack.pop();
                mystack.push(num_1 / num_2);
            }
            else
                mystack.push(atoi(t.c_str()));   //string转换为int,先通过c_str,再通过atoi。
        }
        return mystack.top();
    }
};

你可能感兴趣的:(leetcode,算法,职场和发展)