代码随想录day11

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();
    }
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值