20. 有效的括号
解题思路:一共有三种情况的发生
第一种情况,字符串里左方向的括号多余了 ,所以不匹配;
第二种情况,括号没有多余,但是 括号的类型没有匹配上;
第三种情况,字符串里右方向的括号多余了,所以不匹配。
代码如下:
class Solution {
public:
bool isValid(string s) {
int count = s.size();
stack<char> result;
if(count % 2 != 0)
return false;
for(int i = 0; i < count; i++)
{
if(s[i] == '(') result.push(')');//匹配到左括号就把右括号入栈
else if(s[i] == '{') result.push('}');
else if(s[i] == '[') result.push(']');
else if(result.empty()|| s[i] != result.top()) return false;
//如果result数组空了或者s[i]和入栈的括号不匹配,false
else result.pop();//匹配上则pop出栈
}
return result.empty();//遍历完字符result数组不为空,意思就是有括号落单了,false;否则ture。
}
};
这里有一个很坑的地方:我把
else if(result.empty()|| s[i] != result.top())
写成了
else if(s[i] != result.top()|| result.empty())
运行一直显示编译错误,找了好久的原因,结果把两个条件的位置交换下就行了。查了下,是c++短路的问题。
c++短路
与逻辑短路
如果第一个表达式的结果为false,则整个表达式结果必定为false,这时候不会再去执行第二个表达式;如果第一个表达式的结果为true,则需要继续执行第二个表达式,只有当第二个表达式也为true时,整个表达式才会返回true。
或逻辑短路
如果第一个表达式的结果为true,则整个表达式结果必定为true,这时候不会再去执行第二个表达式;如果第一个表达式的结果为false,则需要继续执行第二个表达式,只有当第二个表达式也为false时,整个表达式才会返回false。
1047. 删除字符串中的所有相邻重复
思路:遍历到当前字符时,与栈顶元素作比较,相同则出栈,不同则入栈。
最后,得到的结果pop到为字符串,再reverse操作一下,就可以得到最后的结果。
代码如下:
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(); // s 与 st.top()相等的情况
}
}
string result = "";
while (!st.empty()) { // 将栈中元素放到result字符串汇总
result += st.top();
st.pop();
}
reverse (result.begin(), result.end()); // 此时字符串需要反转一下
return 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(num1 + num2);
}
if(tokens[i] == "-"){
st.push(num1 - num2);
}
if(tokens[i] == "*"){
st.push(num1 * num2);
}
if(tokens[i] == "/"){
st.push(num1 / num2);
}
}
else{
st.push(stoll(tokens[i]));
}
}
int result = st.top();
return result;
}
};