20. 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 注意空字符串可被认为是有效字符串。
若遇到左括号就直接入栈,若遇到右括号,若栈为空就匹配失败,若不为空就弹出栈顶,进行匹配, 最后栈空时则匹配成功。
class Solution {
public:
bool isValid(string s) {
stack<char> stk;
if(s.size()%2==1) return false;
for(char c:s){
if(c=='('||c=='['||c=='{'){//左括号直接入栈
stk.push(c);
}else{//右括号进行匹配
if(!stk.empty()){
char temp=stk.top();
stk.pop();
if(temp=='('&&c!=')') return false;
if(temp=='['&&c!=']') return false;
if(temp=='{'&&c!='}') return false;
}else{
return false;
}
}
}
return stk.empty();//最后栈为空时匹配完成
}
};
1047. 删除字符串中的所有相邻重复项
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
- 输入:"abbaca"
- 输出:"ca"
用数组模拟栈,下标模拟栈顶指针,若栈顶元素与当前字符不匹配就入栈,若匹配就出栈。
char* removeDuplicates(char* s) {
int n=strlen(s);
char* stk=malloc(sizeof(char)*(n+1));//数组模拟栈
int retsize=0;//模拟栈顶指针
for(int i=0;i<n;++i){
if(retsize>0&&stk[retsize-1]==s[i]){//若是相同就抵消
retsize--;
}else{
stk[retsize++]=s[i];//入栈
}
}
stk[retsize]='\0';
return stk;
}
150. 逆波兰表达式求值
根据 逆波兰表示法,求表达式的值。
有效的运算符包括 + , - , * , / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
示例 1:
- 输入: ["2", "1", "+", "3", " * "]
- 输出: 9
遇到数字直接入栈,遇到运算符就弹出两个数字进行运算,将结果压入栈中。
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> sk;
for(string s:tokens){
if(s!="+"&&s!="-"&&s!="*"&&s!="/"){
sk.push(stoi(s));
}else{
int b=sk.top();sk.pop();
int a=sk.top();sk.pop();
if(s=="+"){
int temp=a+b;
sk.push(temp);
}else if(s=="-"){
int temp=a-b;
sk.push(temp);
}else if(s=="*"){
int temp=a*b;
sk.push(temp);
}else if(s=="/"){
int temp=a/b;
sk.push(temp);
}
}
}
return sk.top();
}
};