有效的括号 删除字符串中的所有相邻重复项 逆波兰表达式求值
有效的括号
法1: 三种情形下的字符串无法成为有效括号,
//遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false
//对应完左侧括号右侧括号多出来
//已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配
bool isValid(string s) {
int len = s.length();
if (len%2 != 0) return false;
//() [] {}return false的三种情形
//遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false
//对应完左侧括号右侧括号多出来
//已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配
stack<char>stored_char;
for (int i = 0; i < len; ++i) {
if (s[i] == '{') stored_char.push('}');
else if (s[i] == '(') stored_char.push(')');
else if (s[i] == '[') stored_char.push(']');
//第三种情形 + 第一种情形 不熟悉条件3怎么写stored_char.empty()
else if(stored_char.empty() || s[i] != stored_char.top()) return false;
else{
stored_char.pop();
}
}
return stored_char.empty();
}
删除字符串中的所有相邻重复项
1047. 删除字符串中的所有相邻重复项
法1: 栈中存储不成对的char,拼接完成之后胡需要反转reverse();
clion中报错,不晓得啥子原因。
stack<char> store_char;
//实践想法 stack<char>存放不成对的char 最后将char拼成string ans
for (char c : s){
if (store_char.empty() || c != store_char.top()){
store_char.push(c);
}else{
store_char.pop();
}
}
string ans = "";
while (!store_char.empty()) { // 未想到使用while循环条件
// 将栈中元素放到result字符串汇总
ans += store_char.top();
cout << ans << endl;
store_char.pop();
}
reverse(ans.begin(), ans.end());
return ans;
法2:直接使用string类的back()进行判断并拼接
string removeDuplicates(string s) {
//直接使用string类的back()
/*string ans = "0";
for (char c : s) {
if (c == ans.back()) ans.pop_back();
else ans.push_back(c);
}
return ans.substr(1);*/
}
逆波兰表达式求值
法1: 常规思路 数值裂解 求平方和 放入set 平方和在set中已经存在->no_happy 反之 happy
int evalRPN(vector<string>& tokens) {
// isalnum(tokens[0][0]);
stack<int> st;
for ( auto &item: tokens){
if (isNumber(item))st.push(stoi(item));
else{
int num = getLabel(item);
if (!st.empty()){
int f1 = st.top();
st.pop();
int f2 = st.top();
st.pop();
int f3;
switch (num) {
case 0:
f3 = f1 + f2;
break;
case 1:
f3 = f2 - f1;
break;
case 2:
f3 = f1 * f2;
break;
case 3:
f3 = f2 / f1;
break;
}
st.push(f3);
}
}
}
return st.top();
}
此处添加了两个函数,分别判断是否为数字/以及运算符号,如下:
int getLabel(string& item) {
if (item == "+")return 0;
else if (item == "-")return 1;
else if (item == "*")return 2;
else return 3;
}
bool isNumber(string& token) {
return !(token == "+" || token == "-" || token == "*" || token == "/");
}