leetcode 856. 括号的分数

题目:

给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:

  • () 得 1 分。
  • AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。
  • (A) 得 2 * A 分,其中 A 是平衡括号字符串。

提示:

  1. S 是平衡括号字符串,且只含有 ( 和 ) 。
  2. 2 <= S.length <= 50 







题目解析:

     可以用两个栈来做,一个栈保存操作符号,另一个栈保存操作数,对于括号,我们先要把括号变成操作数,所以必须两个两个字符来判断,所以一共四个类别,分别是

     1、“ (( ”   , 这个情况是要把括号内的数乘2,所以符号栈压入乘法,我用数字2 标志当成乘法

     2、“ () ”  , 这个情况等于数字1,  所以数字栈压入 1

     3、“  )( ” , 这个情况是左右两边的数字做加法,所以符号栈压入加法,我用数字0 标志当成加法

     4、“ )) ” , 这个情况是括号内乘法结束, 所以要从符号栈里取符号,(1)如果栈顶为2(也就是乘法),取数字栈栈顶元素,乘2后再次压入数字栈,符号栈的栈顶2出栈;(2)如果栈顶为0(也就是加法),取数字栈栈顶两个元素做加法后压栈,栈顶0出栈,重复次操作,直到栈顶为2,返回(1)操作。

当符号栈不为空,继续“))”的情况的操作,直到为空, 最后的数字栈栈顶就是结果。

代码:

class Solution {

public:

    int scoreOfParentheses(string S) {

        stack<int> stk_sym;

        

        stack<int> stk_num;

        for(int i = 0; i < S.size()-1; i++){

            if(S[i] == '(' && S[i+1] == '('){

                stk_sym.push(2);

            }

            else if(S[i] == '(' && S[i+1] == ')')

                stk_num.push(1);

            else if(S[i] == ')' && S[i+1] == '('){

                stk_sym.push(0);

            }

            else if(S[i] == ')' && S[i+1] == ')'){

                if(stk_sym.top() == 0){

                    while(stk_sym.top() == 0){

                        int x = stk_num.top();

                        stk_num.pop();

                        int y = stk_num.top();

                        stk_num.pop();

                        stk_num.push(x+y);

                        stk_sym.pop();

                    }

                    int x = stk_num.top();

                    stk_num.pop();

                    stk_num.push(x*2);

                    stk_sym.pop();

                }

                else{

                    int x = stk_num.top();

                    stk_num.pop();

                    stk_num.push(x*2);

                    stk_sym.pop();

                }

            }

        }

        while(!stk_sym.empty()){

            if(stk_sym.top() == 2){

                int x = stk_num.top();

                stk_num.pop();

                stk_num.push(2*x);

                stk_sym.pop();

            }

            else if(stk_sym.top() == 0){

                int x = stk_num.top();

                stk_num.pop();

                int y = stk_num.top();

                stk_num.pop();

                stk_num.push(x+y);

                stk_sym.pop();

            }

        }

        return stk_num.top();

    }


};





















  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值