感觉今天的题还挺简单的,以前都做过,很容易理解。
这一题主要是要分析出三种不有效的情况:
- 左括号多余,所以不匹配
- 右括号多余,所以不匹配
- 括号没有多余,但是括号的类型匹配不上
对了,一开始可以判断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;
}
};
逆波兰表达式就是一种后缀表达法,这题就是要将后缀表达法转换成中缀表达法来计算。
这题败在了string与long long int之间的转换,我本来企图用(long long int)来强制转换,但是强制类型转换(也称为C风格类型转换或旧式类型转换)只能用于将一种数值类型转换为另一种数值类型。
数值类型通常作为基本数据类型在内存中占据固定的空间,包括整型、浮点型和其他类型。可以使用类似于(int)的形式来强制类型转换。
在C++中,数值类型主要分为以下几类:
整型(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
: 无符号长长长整型。注意:
short
、int
、long
和long long
的具体大小(即它们可以存储的值的范围)取决于编译器和平台。C++标准只规定了它们之间的大小关系(long long
>=long
>=int
>=short
),但没有规定具体的位数。浮点型(Floating-Point Types)
float
: 单精度浮点型,用于存储带小数点的数值。double
: 双精度浮点型,用于存储更大范围或更高精度的带小数点的数值。它通常是C++中浮点运算的首选类型。long double
: 长双精度浮点型,用于存储比double
更高精度的浮点数值。不过,其精度提升因平台和编译器的不同而异。其他数值类型
wchar_t
: 宽字符类型,用于存储宽字符(如Unicode字符)。它的大小也取决于编译器和平台。- 枚举类型(Enumeration Types):通过
enum
关键字定义,用于存储一组命名的常量整数值。这些数值类型在C++中都有明确的定义和用途,并且支持相应的算术运算和类型转换。
但是string不是数值类型,是一种定义的类,不能这么转换。 不像char之间隐式转换就行。
- stoi()能将string类型转换为int类型;
- stol()能将string类型转换为long int类型;
- stoll()能将string类型转换为long long int类型。
如果字符串不能被成功解析为一个整数(例如,如果它包含非数字字符),则这些函数将抛出一个std::invalid_argument
或std::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.