20.有效的括号
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() || st.top() != s[i]) return false;
else st.pop();
}
return st.empty();
}
};
利用栈的性质,如果长度是奇数则不成立。遍历一遍s,如果遇到三种左括号,在栈中存放对应的右括号。当栈顶的元素和右括号不同时,输出false。如果相同则弹出这个元素。最后栈是空的话说明符合题意。
1047.删除字符串中所有相邻的重复项
class Solution {
public:
string removeDuplicates(string S) {
stack<char>st;
for(char s : S){
if(st.empty() || s != st.top()){
st.push(s);
}else{
st.pop();
}
}
string result = "";
while(!st.empty()){
result += st.top();
st.pop();
}
reverse (result.begin(), result.end());
return result;
}
};
这道题很像消消乐,把S的值遍历一遍,如果和栈的顶部元素不同就把s放进栈里,相同就把栈的元素放出去,然后把栈里的元素放到result中,最后得到相反的字符串,然后反转就行
150.逆波兰表达式求值
class Solution {
public:
int evalRPN(vector<string>& tokens) {
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]));
}
}
long long result = st.top();
st.pop();
return result;
}
};
当遇到加减乘除时把前两个数字做对应的运算,不是的话把对应的值放到栈里
最后把栈里的元素清空,释放内存