尝试了一下,不会搞,看一下视频的方法。
先分析几种括号不匹配的情况。1.左括号多余不匹配。2.括号没有多余但是括号类型不匹配。3.右括号多余不匹配。
先遍历字符串,如果是左括号就把对应的右括号入栈,如果是右括号则出栈。
class Solution {
public:
bool isValid(string s) {
stack<int> st;
if(s.size() % 2 != 0) return false; //字符串长度为奇数一定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]) {//若出栈的元素和s[i]不等则为第二种情况,若为空则为第三种情况右括号多余
//细节!这里或条件如果把st.top() != s[i]放在前面,当栈为空时会出现报错
return false;
}else { //如果不是这些情况那么出栈
st.pop();
}
}
if(!st.empty()) { //遍历完成后如果栈不为空则为第一种情况左括号多余
return false;
}else { //如果栈为空则说明匹配成功
return true;
}
}
};
注意pop()是无参。
搞一个栈,遍历字符串。第一次遍历到该元素则入栈,第二次遍历到该元素则出栈。直至遍历完之后将所有元素出,然后再反转字符串。
class Solution {
public:
string removeDuplicates(string s) {
stack<char> st;
for(int i = 0;i < s.size();i++){
if(st.empty() || st.top() != s[i]) { //如果栈为空或者栈顶元素和S遍历到的元素不相等,则入栈
st.push(s[i]);
}else {
st.pop();
}
}
string result = {}; //新建一个空字符串
while(!st.empty()) { //当栈不为空时把元素出栈并拼接到字符串后
result += st.top();
st.pop();
}
//注意不能这样写return reverse(result,result.size()); reverse没有返回值
reverse(result.begin(),result.end());
return result;
}
};
没问题!很好!
最后反转字符串遇到的问题:字符串反转三种方式:1.使用string.h中的strrev函数,strrev(s),无返回值。2.使用algorithm中的reverse函数,reverse(s.begin(),s.end()),无返回值。3.自己编写函数。
搞一个栈,开始遍历数组tokens,如果是数字则入栈,如果是符号则将符号前两个数字出栈进行运算后得到一个数字再进栈,遍历完成时则输出最后的结果。
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<char> st; //搞一个栈
int res = 0; //搞一个res计算两个数
for(int i = 0;i < tokens.size();i++){
if(tokens[i] >= -200 && tokens[i] <= 200){
st.push(tokens[i]);
}else {
st.pop();
st.pop();
res = int(tokens[i - 1]) tokens[i] int(tokens[i - 2]);
st.push(res);
}
}
return st.top();
}
};
感觉思路没错,代码有问题。
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]));
}
}
int result = st.top();
return result;
}
};