B - Bracket Sequence题解

B - Bracket Sequence

思路:
用一个flag来标记括号的数目,如果括号数目是个偶数的话,就代表当前要执行'+'操作,反之就是'*'操作。对于最外层的数,是没有计算的。
所以最后要单独判断栈是不是空的,如果不是空的,还要把这些数弹出来进行计算。
想差了一点,应该是计算完一个括号之后,应该把这个数放到栈中,然后再去计算下一个括号。

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int mod = 1e9 + 7;
int n;
string st;
stack<int> sta;
int flag;

signed main(){
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> st;
        if(st[0] =='('){
            sta.push(-1);
            flag ++;
        }
        else if(st[0] == ')'){
            if(flag & 1){
                int ans = 1;
                while(!sta.empty() && sta.top() != -1){
                    int x = sta.top();
                    ans = ans * x % mod;
                    sta.pop();
                }
                if(!sta.empty() &&sta.top() == -1) sta.pop();
                sta.push(ans);
            }
            else{
                int ans = 0;
                while(!sta.empty() && sta.top() != -1){
                    int x = sta.top();
                    sta.pop();
                    ans = (ans + x) % mod;
                }
                if(!sta.empty() && sta.top() == -1) sta.pop();
                sta.push(ans);
            }
            flag --;
        }
        else{
            int x = 0, y;
            for(int j = 0; j < st.size(); j++){
                y = (int)(st[j] - '0');
                x = x * 10 + y;
            }
            //cout << x << endl;
            sta.push(x);
        }
    }
    while(sta.size() > 1){
        int x = sta.top(); sta.pop();
        int y = sta.top(); sta.pop();
        sta.push((x + y)%mod);
    }
    cout << sta.top();
    return 0;
}
posted @ 2022-11-19 20:41  风归去  阅读(27)  评论(0编辑  收藏  举报