LeetCode:20. 有效的括号
先来分析一下 这里有三种不匹配的情况
1.第一种情况,字符串里左方向的括号多余了 ,所以不匹配。
2.第二种情况,括号没有多余,但是 括号的类型没有匹配上
3.第三种情况,字符串里右方向的括号多余了,所以不匹配。 括号匹配。
第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false。
第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false。
第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false
C++实现:
class Solution {
public:
bool isValid(string s){
stack<char> st;
//如果字符串的长度为基数肯定不满足
if (s.size() % 2 != 0)
return false;
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]) //1.对应情况2和3 2.st.empty()在前防止空栈出现异常,判断是否为空
return false;
else
st.pop(); /// 对应情况1
}
return st.empty();
}
};
Python实现:
def isValid(self, s: str) -> bool:
stack = []
for item in s:
if item == '(':
stack.append(')')
elif item == '[':
stack.append(']')
elif item == '{':
stack.append('}')
# 对应情况2和3
elif not stack or item != stack[-1]:
return False
# 对应情况1
else:
stack.pop()
return True if not stack else False
1047. 删除字符串中的所有相邻重复项
本题是匹配相邻元素,最后都是做消除的操作,是用栈来解决的经典题目。
C++实现:
可以拿字符串直接作为栈,这样省去了栈还要转为字符串的操作
class Solution {
public:
string removeDuplicates(string s){
string result;
for (char s : s){
if(result.empty() || result.back() != s)
result.push_back(s);
else
result.pop_back();
}
return result;
}
};
Python实现:
class Solution:
def removeDuplicates(self, s: str) -> str:
result = []
for item in s:
if not result or result[-1] != item:
result.append(item)
else:
result.pop()
return "".join(result)
150. 逆波兰表达式求值
先导知识:什么是逆波兰表达式(后面补充)
可能出现连续相乘的,所以使用 long long
C++实现:
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<long long> st;
for(string item : tokens){
if(item == "+" || item == "-" ||item == "*" ||item == "/"){
long long num1 = st.top();
st.pop();
long long num2 = st.top();
st.pop();
// 注意弹出的顺序
if(item == "+") st.push(num2 + num1);
if(item == "-") st.push(num2 - num1);
if(item == "*") st.push(num2 * num1);
if(item == "/") st.push(num2 / num1);
}else {
st.push(stoll(item));
}
}
long long result = st.top();
st.pop();
return result;
}
};
补充知识:stol和stoll函数
Python实现:
def evalRPN(self, tokens: List[str]) -> int:
st = []
for item in tokens:
if item not in {"+", "-", "*", "/"}:
st.append(item)
else:
num1, num2 = st.pop(), st.pop()
# eval( )函数 :可以理解为评估函数(英文eval是评估的意思),一般用于字符串与数字的转换,将字符串转换为可以用于计算的数值。
st.append(int(eval(f'{num2} {item} {num1}')))
return int(st.pop())