紧凑字符串(C++)

提示

把字符串展开
例如:
Example1:
1(1a2b1(ab)1c)
abbabc
Example2:
3(ab2(4ab))
abaaaabaaaababaaaabaaaababaaaabaaaab

代码


#include <iostream>
#include <stack>

using namespace std;

//栈顶是数字,并且要入栈字符是字母
bool num_let(char top, char str = 'k') {
    return (top <= '9' && top >= '0') && (str <= 'z' && str >= 'A');
}

//递归打印栈内容
void show(stack<char> &S) {
    while (!S.empty()) {
        char temp = S.top();
        S.pop();
        show(S);
        cout << temp;
    }
}

int main() {

    //1(1a2b1(ab)1c)
    string str = "3(ab2(4ab))";

    stack<char> S;
    for (int i = 0; str[i] != '\0'; ++i) {
        if (S.empty()) {
            S.push(str[i]);
        } else {
            if (num_let(S.top(), str[i])) {
                int temp = S.top() - '0';
                S.pop();
                while (temp--) {
                    S.push(str[i]);
                }
            } else if (str[i] == ')') {

                string tem;
                char c;

                while (!S.empty()) {
                    c = S.top();
                    S.pop();
                    if (!num_let(c) && c != '(') {
                        tem = c + tem;
                    } else {
                        if (c != '(') {
                            int n = c - '0';
                            while (n--) {
                                for (int k = 0; tem[k] != '\0'; ++k) {
                                    S.push(tem[k]);
                                }
                            }
                            break;
                        }

                    }
                }


            } else {
                S.push(str[i]);
            }
        }

    }
    show(S);

    return 0;
}

结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值