前言
LeetCode题目:LeetCode 20、1047、150
Takeaway:今天主要解决的问题都是栈相关的模拟应用,整体难度不高,但是需要了解栈的详细构成。
一、LeetCode 20
用栈就能轻松实现的模拟题,我觉得没有什么难度。考虑一下括号的3种匹配失败情况,然后模拟一下就可以了。
class Solution {
public:
bool isValid(string s) {
stack<char> st;
for(int i=0; i<s.size(); i++){
if(s[i] =='(' || s[i] =='[' || s[i] =='{'){
st.push(s[i]);
}else{
if(st.size()==0){
return false;
}
if((st.top() == '(' && s[i] == ')') || (st.top() == '[' && s[i] == ']') || (st.top() == '{' && s[i] == '}')){
st.pop();
}else{
return false;
}
}
}
if(st.size()==0){
return true;
}else{
return false;
}
}
};
二、LeetCode 1047
我觉得这题和上一题没什么区别,也是使用栈进行的模拟题,没有什么算法难度。值得注意的是边界处理小心,在查看栈的top前,要确保栈不为空,否则会出现溢出bug。
class Solution {
public:
string removeDuplicates(string s) {
stack<char> st;
for(int i=0; i<s.size(); i++){
// 边界处理警告!必须先判断st是否为空,不然会越界
if(!st.empty() && st.top() == s[i]){
st.pop();
}else{
st.push(s[i]);
}
}
string res = "";
while(!st.empty()){
res += st.top();
st.pop();
}
reverse(res.begin(), res.end());
return res;
}
};
三、LeetCode 150
本体题其实本质和前两题没什么区别,都是栈的使用,而我觉得栈的使用来回也就那些,所以其实区别不大,本题最大的收获是学会了stoll()函数,一个将string类型元素转化为数字的函数。
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<long long> stk;
for(int i=0; i<tokens.size(); i++){
if(tokens[i]!="+" && tokens[i]!="-" && tokens[i]!="*" && tokens[i]!="/"){
long long numC = stoll(tokens[i]);
stk.push(numC);
}else{
long long num1 = stk.top();
stk.pop();
long long num2 = stk.top();
stk.pop();
long long num3;
if(tokens[i]=="+"){
num3 = num1+num2;
}else if(tokens[i]=="-"){
num3 = num2-num1;
}else if(tokens[i]=="*"){
num3 = num2*num1;
}else{
num3 = num2/num1;
}
stk.push(num3);
}
}
return stk.top();
}
};
总结
今天的题仍然没有什么难度,全是模拟,主要是强化对栈的理解,都是栈的模拟题,没有什么算法要求。