Leetcode.1047 删除字符串中所有相邻重复项:
1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
本题可以利用栈的思想进行解答。但是此处并不是真正的去使用一个栈,而是利用来替代栈在本题中的作用。具体如下:
首先去遍历给定的字符串,如果为空,则将给定字符串的当前位置字符插入到中,即:
随后,再去检测给定字符串中的字符,如果其不等于中的最后一个字符,则也将这个字符插入,即:
此时再去检测给定字符串中的字符,由于这个字符与中的最后一个字符相同,则删除中的这个字符,即:
因此,整体逻辑就是,如果为空或者的最后一个字符与给定字符串的字符不同,则将给定字符串的字符插入到,否则则删除中的最后一个字符。具体代码如下:
class Solution {
public:string removeDuplicates(string s) {string str;for(int i = 0; i < s.size(); i++){if(str.empty() || s[i] != str.back()){str.push_back(s[i]);}else{str.pop_back();}}return str;}
};
Leetcode.20 有效的括号:
20. 有效的括号 - 力扣(LeetCode)
为了方便理解本题,下面给出三个示例:
对于上面给出的范例,不难发现,由于小括号的左半部分: 多了一个,因此不符合有效括号这一定义
对于上面给出的范例,不难看出,由于右括号多了若干个,因此也不满足有效括号的定义。
在大体了解了有效括号的定义后,下面给出题目解法:
首先创建一个栈,为了方便叙述,这里将这个栈命名为。
首先判断给定字符串的长度是否为偶数,如果不是,则直接返回即可。
遍历给定的字符串,如果位置的内容等于三种括号的左半部分,则向栈中压入这个括号的右半部分。如果位置的内容是三种括号的右半部分,则去和栈顶内容进行比较。
如果相等,则说明括号匹配,栈顶元素。如果不相等,则说明括号不匹配,直接返回
如果在遍历过程中,出现了栈为空的情况,则说明字符串中的括号的右半部分的数量大于左半部分,因此,返回。
在遍历完成后,在此对栈进行一次检测,如果此时栈为空,则说明给定字符串中的括号的左半部分的数量大于右半部分,返回。
对应代码如下:
class Solution {
public:bool isValid(string s) {if(s.size()%2 != 0){return false;}stack<char> st;for(int i = 0; i < s.size(); i++){if(s[i] == '('){st.push(')');}else if(s[i] == '['){st.push(']');}else if(s[i] == '{'){st.push('}');}else if(st.empty() || s[i] != st.top()){return false;}else{ st.pop();}}if(!st.empty()){return false;}return true;}
};
Leetcode.150 逆波兰表达式求值:
150. 逆波兰表达式求值 - 力扣(LeetCode)
原理较为简单,首先创建一个栈,这里命名为。随后遍历给定的字符串数组,如果为运算符,则创建变量,用于存储两次出栈的元素。同时两次,删除栈中的这两个元素。随后,根据运算符,将运算后的解决压入栈中。
如果位置的字符不是运算符,则直接将压入栈中即可。对应代码如下:
class Solution {
public:int evalRPN(vector<string>& tokens) {stack<int> st; for (int i = 0; i < tokens.size(); i++) {if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") {int num1 = st.top();st.pop();int 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(stoi(tokens[i]));}}int result = st.top();return result;}
};