力扣打卡Day11 栈与队列Part02 主要是一些栈的操作

感觉今天的题还挺简单的,以前都做过,很容易理解。

20. 有效的括号 - 力扣(LeetCode)

这一题主要是要分析出三种不有效的情况:

  1. 左括号多余,所以不匹配
  2. 右括号多余,所以不匹配
  3. 括号没有多余,但是括号的类型匹配不上

对了,一开始可以判断s的大小是否为偶数来直接返回值,这种类似的操作叫剪枝(俺一直不知道

class Solution {
public:
    bool isValid(string s) {
        if(s.size()%2!=0) return false;

        stack<char>st;
        for(char ch:s) {
            if(ch=='[') st.push(']');
            else if(ch=='(') st.push(')');
            else if(ch=='{') st.push('}');
            else if (st.empty() || st.top()!=ch) return false;
            else st.pop();
        }

        return st.empty();
    }
};

1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

思路就是栈顶元素和下一个数组中的元素来匹配,如果相等就弹出。最后把栈内剩下的所有元素都插入ans里,然后反转一下。

class Solution {
public:
    string removeDuplicates(string s) {
        stack<char> st;
        string ans;
        for(char ch:s) {
            if(!st.empty()&&ch==st.top()){
                st.pop();
                continue;
            }
            st.push(ch);
        }
        while(!st.empty()) {
            ans+=st.top();
            st.pop();
        }
        reverse(ans.begin(),ans.end());
        return ans;
    }
};

150. 逆波兰表达式求值 - 力扣(LeetCode)

逆波兰表达式就是一种后缀表达法,这题就是要将后缀表达法转换成中缀表达法来计算。

这题败在了string与long long int之间的转换,我本来企图用(long long int)来强制转换,但是强制类型转换(也称为C风格类型转换或旧式类型转换)只能用于将一种数值类型转换为另一种数值类型。

数值类型通常作为基本数据类型在内存中占据固定的空间,包括整型、浮点型和其他类型。可以使用类似于(int)的形式来强制类型转换。

在C++中,数值类型主要分为以下几类:

  1. 整型(Integer Types)

    • bool: 布尔类型,只有两个值:true 和 false。在某些上下文中(如算术运算),它可能会被转换为整数类型(如 int),其中 true 通常转换为1,false 转换为0。
    • char: 字符类型,用于存储字符值。它也可以用来存储小的整数值(通常在一个字节范围内),但是不推荐这样做,因为它可能导致混淆。
    • signed char: 有符号字符类型,可以存储正数、负数和零。
    • unsigned char: 无符号字符类型,只能存储非负整数。
    • short: 短整型,通常用于存储较小的整数。
    • unsigned short: 无符号短整型。
    • int: 整型,用于存储整数。它是C++中最常用的整数类型之一。
    • unsigned int: 无符号整型。
    • long: 长整型,用于存储比 int 更大的整数。
    • unsigned long: 无符号长整型。
    • long long: 长长长整型(或称为长长整型),用于存储非常大的整数。
    • unsigned long long: 无符号长长长整型。

    注意:shortintlong 和 long long 的具体大小(即它们可以存储的值的范围)取决于编译器和平台。C++标准只规定了它们之间的大小关系(long long >= long >= int >= short),但没有规定具体的位数。

  2. 浮点型(Floating-Point Types)

    • float: 单精度浮点型,用于存储带小数点的数值。
    • double: 双精度浮点型,用于存储更大范围或更高精度的带小数点的数值。它通常是C++中浮点运算的首选类型。
    • long double: 长双精度浮点型,用于存储比 double 更高精度的浮点数值。不过,其精度提升因平台和编译器的不同而异。
  3. 其他数值类型

    • wchar_t: 宽字符类型,用于存储宽字符(如Unicode字符)。它的大小也取决于编译器和平台。
    • 枚举类型(Enumeration Types):通过 enum 关键字定义,用于存储一组命名的常量整数值。

这些数值类型在C++中都有明确的定义和用途,并且支持相应的算术运算和类型转换。

但是string不是数值类型,是一种定义的类,不能这么转换。 不像char之间隐式转换就行。

  • stoi()能将string类型转换为int类型;
  • stol()能将string类型转换为long int类型;
  • stoll()能将string类型转换为long long int类型。

如果字符串不能被成功解析为一个整数(例如,如果它包含非数字字符),则这些函数将抛出一个std::invalid_argumentstd::out_of_range异常。

#include <iostream>  
#include <string>  
  
int main() {  
    std::string str = "12345";  
    int i = std::stoi(str);  // 将字符串 "12345" 解析为整数 12345  
    std::cout << i << std::endl;  // 输出:12345  
  
    // 类似地,对于 long 和 long long 类型  
    std::string str_long = "123456789012345";  
    long l = std::stol(str_long);  // 注意:如果整数太大而不能存储在 long 中,可能会导致截断或溢出  
    std::cout << l << std::endl;  // 输出可能是截断后的值,具体取决于 long 的大小  
  
    long long ll = std::stoll(str_long);  // 使用 long long 可以存储更大的整数  
    std::cout << ll << std::endl;  // 输出:123456789012345  
  
    return 0;  
}

说回正题,后缀表达式是栈的经典应用。

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        // 力扣修改了后台测试数据,需要用longlong
        stack<long long> st; 
        for (int i = 0; i < tokens.size(); i++) {
            if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") {
                long long num1 = st.top();
                st.pop();
                long long num2 = st.top();
                st.pop();
                if (tokens[i] == "+") st.push(num2 + num1);
                if (tokens[i] == "-") st.push(num2 - num1);
                if (tokens[i] == "*") st.push(num2 * num1);
                if (tokens[i] == "/") st.push(num2 / num1);
            } else {
                st.push(stoll(tokens[i]));
            }
        }
        return st.top();
    }
};

ps:这题如果判断tokens[i]是否为数字,可以用isdigit()函数,返回1或0.

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值