AcWing - 150 - 括号画家 = 栈

https://www.acwing.com/problem/content/152/

思路:开一个pair栈,第一个元素存字符的种类,第二个元素存“这个字符之后曾经匹配过的最大长度”。

为什么是“这个字符之后”,我也很难说清楚,但是感觉这样是对的。某一次遇到右括号弹栈之后,顺便把栈顶的最大长度也update了。

一开始插入一个虚拟节点就不需要判空了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

char ss[100005];
stack<pair<char, int> > s;

int main() {
#ifdef Yinku
    freopen("Yinku.in", "r", stdin);
#endif // Yinku
    int sum = 0;
    scanf("%s", ss);
    int n = strlen(ss);
    s.push({'#', 0});
    for(int i = 0; i < n; ++i) {
        if(ss[i] == ')') {
            if(s.top().first == '(') {
                int tmp = s.top().second;
                s.pop();
                char c2 = s.top().first;
                int tmp2 = s.top().second;
                s.pop();
                s.push({c2, tmp2 + tmp + 2});
                sum = max(sum, tmp2 + tmp + 2);
            } else {
                s.push({ss[i], 0});
            }
        } else if(ss[i] == ']') {
            if(s.top().first == '[') {
                int tmp = s.top().second;
                s.pop();
                char c2 = s.top().first;
                int tmp2 = s.top().second;
                s.pop();
                s.push({c2, tmp2 + tmp + 2});
                sum = max(sum, tmp2 + tmp + 2);
            } else {
                s.push({ss[i], 0});
            }
        } else if(ss[i] == '}') {
            if(s.top().first == '{') {
                int tmp = s.top().second;
                s.pop();
                char c2 = s.top().first;
                int tmp2 = s.top().second;
                s.pop();
                s.push({c2, tmp2 + tmp + 2});
                sum = max(sum, tmp2 + tmp + 2);
            } else {
                s.push({ss[i], 0});
            }
        } else {
            s.push({ss[i], 0});
        }
    }
    printf("%d\n", sum);
}

转载于:https://www.cnblogs.com/Inko/p/11423111.html

计算表达式 / int calculate(char expression) { int num_stack[MAX_SIZE]; char op_stack[MAX_SIZE]; int num_top = -1, op_top = -1; int len = strlen(expression); for (int i = 0; i < len; i++) { if (expression[i] == '(') { op_stack[++op_top] = '('; } else if (expression[i] == ')') { while (op_top >= 0 && op_stack[op_top] != '(') { char op = op_stack[op_top--]; int num2 = num_stack[num_top--]; int num1 = num_stack[num_top--]; if (op == '+') { num_stack[++num_top] = num1 + num2; } else if (op == '-') { num_stack[++num_top] = num1 - num2; } else if (op == '') { num_stack[++num_top] = num1 * num2; } else if (op == '/') { num_stack[++num_top] = num1 / num2; } } if (op_stack[op_top] == '(') { op_top--; } } else if (is_digit(expression[i])) { int num = 0; while (i < len && is_digit(expression[i])) { num = num * 10 + expression[i] - '0'; i++; } i--; num_stack[++num_top] = num; } else if (is_operator(expression[i])) { while (op_top >= 0 && op_stack[op_top] != '(' && priority(op_stack[op_top]) >= priority(expression[i])) { char op = op_stack[op_top--]; int num2 = num_stack[num_top--]; int num1 = num_stack[num_top--]; if (op == '+') { num_stack[++num_top] = num1 + num2; } else if (op == '-') { num_stack[++num_top] = num1 - num2; } else if (op == '') { num_stack[++num_top] = num1 * num2; } else if (op == '/') { num_stack[++num_top] = num1 / num2; } } op_stack[++op_top] = expression[i]; } } while (op_top >= 0) { char op = op_stack[op_top--]; int num2 = num_stack[num_top--]; int num1 = num_stack[num_top--]; if (op == '+') { num_stack[++num_top] = num1 + num2; } else if (op == '-') { num_stack[++num_top] = num1 - num2; } else if (op == '*') { num_stack[++num_top] = num1 * num2; } else if (op == '/') { num_stack[++num_top] = num1 / num2; } } return num_stack[num_top]; }分析这段代码
06-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值