目录
1047. 删除字符串中的所有相邻重复项
解析
题解
class Solution {
public:
string removeDuplicates(string s) {
// 69.专题十二_栈_删除字符中的所有相邻重复项_C++
string ret; // 搞一个数组,模拟栈结构即可
for(auto ch : s)
{
if(ret.size() && ret.back() == ch) ret.pop_back(); // 出栈
else ret += ch; // 入栈
}
return ret;
}
};
844. 比较含退格的字符串
解析
题解
class Solution {
public:
bool backspaceCompare(string s, string t) {
// 69.专题十二_栈_删除字符中的所有相邻重复项_C++
return changeStr(s) == changeStr(t);
}
string changeStr(string& s)
{
string ret;
for(auto ch : s)
{
if(ch != '#') ret += ch;
else if(ret.size()) ret.pop_back();
}
return ret;
}
};
227. 基本计算器 II
解析
题解
class Solution {
public:
int calculate(string s) {
// 70.专题十二_栈_比较含退格的字符串_C++
vector<int> st; // 用数组模拟栈结构
int i = 0, n = s.size();
char op = '+';
while(i < n)
{
if(s[i] == ' ') i++;
else if(s[i] >= '0' && s[i] <= '9')
{
// 先把这个数提取出来
int tmp = 0;
while(i < n && s[i] >= '0' && s[i] <= '9')
tmp = tmp * 10 + (s[i++] - '0');
if(op == '+') st.push_back(tmp);
else if(op == '-') st.push_back(-tmp);
else if(op == '*') st.back() *= tmp;
else st.back() /= tmp;
}
else
{
op = s[i];
i++;
}
}
int ret = 0;
for(auto x : st) ret += x;
return ret;
}
};
394. 字符串解码
解析
题解
class Solution {
public:
string decodeString(string s) {
// 72.专题十二_栈_字符串解码_C++
stack<int> nums;
stack<string> st;
st.push("");
int i = 0, n = s.size();
while(i < n)
{
if(s[i] >= '0' && s[i] <= '9')
{
int tmp = 0;
while(s[i] >= '0' && s[i] <= '9')
{
tmp = tmp * 10 + (s[i] - '0');
i++;
}
nums.push(tmp);
}
else if(s[i] == '[')
{
i++; // 把括号后面的字符提取出来
string tmp = "";
while(s[i] >= 'a' && s[i] <= 'z')
{
tmp += s[i];
i++;
}
st.push(tmp);
}
else if(s[i] == ']')
{
string tmp = st.top();
st.pop();
int k = nums.top();
nums.pop();
while(k--) st.top() += tmp;
i++; // 跳过这个括号
}
else
{
string tmp = "";
while(s[i] >= 'a' && s[i] <= 'z')
{
tmp += s[i];
i++;
}
st.top() += tmp;
}
}
return st.top();
}
};
946. 验证栈序列
解析
题解
class Solution {
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
// 73.专题十二_栈_验证栈序列_C++
stack<int> st;
int i = 0, n = popped.size();
for(auto x : pushed)
{
st.push(x);
while(st.size() && st.top() == popped[i])
{
st.pop();
i++;
}
}
return i == n;
}
};