左括号直接入栈,遇到右括号时,如果栈顶元素是左括号,即是(),则分数是1,将左括号出栈,分数1入栈,如果栈顶元素是分数,则循环出栈并累加,最后结果乘2,再将对应的左括号出栈,结果入栈,重复上述操作,最后累加栈中分数即是最终结果。
class Solution {
public:
int scoreOfParentheses(string S) {
stack<int> stk;//记'('为-1
for(char ch:S) {
if(ch=='(') {
stk.push(-1);
}
else {//是右括号
if(stk.top()==-1) {//栈顶为左括号
stk.pop();
stk.push(1);
}
else {//栈顶是分数
//将分数都出栈
int num = 0;
while(stk.top()!=-1) {
num += stk.top();
stk.pop();
}
stk.pop();//左括号出栈
stk.push(num*2);
}
}
}
int ret = 0;
while(!stk.empty()) {
ret+=stk.top();
stk.pop();
}
return ret;
}
};