1、删除字符串中的所有相邻重复项
1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
算法原理
abbaca要求删除相邻重复项,这里把相同的bb删除之后变成"aaca",还需要把aa删除
把字符串的所有字符依次入栈,当栈顶元素与要插入的元素相同时,把栈顶的元素pop()
代码
cpp
class Solution {
public:
string removeDuplicates(string s) {
vector<char> arr;
for(auto ch : s)
{
if(arr.empty())
{
arr.push_back(ch);
}
else
{
if(arr.back()==ch)
{
arr.pop_back();
}
else
{
arr.push_back(ch);
}
}
}
string ret;
for(auto ch : arr)
{
ret+=ch;
}
return ret;
}
};
2、比较含退格的字符串
算法原理
入栈出栈
代码
cpp
class Solution {
public:
bool backspaceCompare(string s, string t) {
string s_ret;
for(auto s_ch : s)
{
if(s_ch == '#')
{
if(s_ret.empty())
continue;
else
s_ret.pop_back();
}
else
{
s_ret+=s_ch;
}
}
string t_ret;
for(auto t_ch : t)
{
if(t_ch == '#')
{
if(t_ret.empty())
continue;
else
t_ret.pop_back();
}
else
{
t_ret+=t_ch;
}
}
if(s_ret==t_ret)
return true;
else
return false;
}
};
3、基本计算器 II
算法原理
-
- * /
1、'+'直接入栈要加的数,'-'入栈负数
2、'*' '/'把栈顶元素取出来,跟要乘和除的数计算之后插入
3、最后把栈里所有元素加起来
注意:
1、处理不是个位数的情况
2、最开始的符号需要初始化为'+',不然就不会进入最后判断符号的逻辑
代码
cpp
class Solution {
public:
int calculate(string s) {
//1、没有括号,乘除优先计算,加减符号直接入栈
//2、处理不是个位数字的情况
//初始化为'+'
char cur='+';
vector<int> ret;
for(int i=0;i<s.size();)
{
if(s[i]==' ')
{
i++;
continue;
}
if(s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/')
{
cur=s[i++];
continue;
}
//处理不是个位的情况
long num=0;
while(s[i] != '+' && s[i] != '-' && s[i] != '*' && s[i] != '/')
{
if(i == s.size() || s[i]==' ')
break;
int tmp=s[i++]-'0';
num*=10;
num+=tmp;
}
if(cur=='+')
{
ret.push_back(num);
}
else if(cur == '-')
{
ret.push_back(-num);
}
else if(cur == '*')
{
int back=ret.back();
ret.pop_back();
back*=num;
ret.push_back(back);
}
else if(cur == '/')
{
int back=ret.back();
ret.pop_back();
back/=num;
ret.push_back(back);
}
}
int sum=0;
for(auto n : ret)
{
sum+=n;
}
return sum;
}
};
4、 字符串解码
算法原理
这里需要两个栈来存,一个存字符,一个存放数字,分为四种情况
1、'['
直接把后面所有的字母字符串入栈
2、数字
把数字插入数字栈,需要处理不是个位数的情况
3、']'
把两个栈的栈顶元素出栈,然后进行处理解析
4、单个字符串的情况
直接插入字符栈的栈顶元素后面
++注意:++
字符串的栈最开始要插入一个空的栈顶元素,如果最开始字符串就是单独的字符,那么就会直接加载栈顶元素,如果栈顶元素没有值得话,就会出错
代码
cpp
class Solution {
public:
string decodeString(string s) {
stack<int> int_st;
stack<string> string_st;
int n=s.size();
//栈顶最开始必须有元素
string_st.push("");
int i=0;
while(i<s.size())
{
//中间所有元素入栈
if(s[i] == '[')
{
string str1="";
i++;
while(i<n && s[i] >= 'a' && s[i] <= 'z')
{
str1+=s[i++];
}
string_st.push(str1);
}
else if(s[i] == ']')
{
//两个栈都出栈,然后进行计算之后加到string_st栈顶
string str_top=string_st.top();
string_st.pop();
int int_top=int_st.top();
int_st.pop();
for(int j=0;j<int_top;j++)
{
string_st.top()+=str_top;
}
i++;
}
else if(s[i]-'0'>=0 && s[i]-'0'<=9)
{
//将数字入栈,需要处理不是单个数字的情况
int num=0;
while(s[i]-'0'>=0 && s[i]-'0'<=9)
{
int tmp=s[i++]-'0';
num*=10;
num+=tmp;
}
int_st.push(num);
}
else//单个字符串,直接插入
{
string str3;
while(i<n && s[i] >= 'a' && s[i] <= 'z')
{
str3+=s[i++];
}
string_st.top()+=str3;
}
}
return string_st.top();
}
};
5、验证栈序列
算法原理
新建一个栈,把pushed数组元素入栈,如果栈顶元素和poped数组得相同,直接出栈顶元素,然后++pop数组下标位置
代码
cpp
class Solution {
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
stack<int> st;
int j=0;
for(auto it : pushed)
{
st.push(it);
while(!st.empty() && st.top()==popped[j])
{
j++;
st.pop();
}
}
if(st.empty())
{
return true;
}
else
{
return false;
}
}
};