报文解压缩

报文解压缩

■ 题目描述

  • 为了提升数据传输的效率,会对传输的报文进行压缩处理。
  • 输入一个压缩后的报文,请返回它解压后的原始报文。
  • 压缩规则:n[str],表示方括号内部的 str 正好重复 n 次。
  • 注意 n 为正整数(0 < n <= 100),str只包含小写英文字母,不考虑异常情况。

输入描述:

输入压缩后的报文:

  1. 不考虑无效的输入,报文没有额外的空格,方括号总是符合格式要求的;
  2. 原始报文不包含数字,所有的数字只表示重复的次数 n ,例如不会出现像 5b 或 3[8] 的输入;

输出描述:

  • 解压后的原始报文

注:

  • 原始报文长度不会超过1000,不考虑异常的情况

示例 1 输入输出示例仅供调试,后台判题数据一般不包含示例

输入

3[k]2[mn]

输出

kkkmnmn

说明

  • k 重复3次,mn 重复2次,最终得到 kkkmnmn

示例 2 输入输出示例仅供调试,后台判题数据一般不包含示例

输入

3[m2[c]]

输出

mccmccmcc

说明

  • m2[c] 解压缩后为 mcc,重复三次为 mccmccmcc

思路:

我们全部压入栈后,遇到]后弹出计算,然后再压会栈中,最后判断栈是否为空即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;

int main(){
string code;
cin >> code;
stack<string> st;
string decode;
int i = 0;
string tmp;
tmp = code[i];
st.push(tmp);
while(!st.empty()){
i++;
if(code[i] != ']' && i < code.size()){
string tmp;
tmp = code[i];
st.push(tmp);
}else{
string str;
string num;
while(!st.empty() && st.top() != "["){
str += st.top();
st.pop();
}
//去掉[
if(!st.empty()){
st.pop();
}
//计算数字
while(!st.empty() && st.top() >= "0" && st.top() <= "9"){
num += st.top();
st.pop();
}
if(num != ""){
reverse(num.begin(), num.end());
int cnt = stoi(num);
string strTmp;
for(int i = 0; i < cnt; i++){
strTmp += str;
}
st.push(strTmp);
}
decode = str;
}
}
//由于是栈,后进先出,所以需要翻转
reverse(decode.begin(), decode.end());
cout << decode << endl;
return 0;
}