Given an expression s includes numbers, letters and brackets. Number represents the number of repetitions inside the brackets(can be a string or another expression).Please expand expression to be a string.
样例
s = abc3[a] return abcaaa
s = 3[abc] return abcabcabc
s = 4[ac]dy, return acacacacdy
s = 3[2[ad]3[pf]]xyz, return adadpfpfpfadadpfpfpfadadpfpfpfxyz
提醒:
1、栈操作一定要先判断栈是否为空再进行操作。
2、方便的个位char转int,可以直接char - ‘0’。
3、字符串反向reverse(str.begin(),str.end())。
4、注意多位次数。
//
// ss.cpp
// CCF
//
// Created by 李鹏泽 on 2017/7/24.
// Copyright © 2017年 INGSwifters. All rights reserved.
//
#include <stack>
#include <string>
#include <cstring>
#include <iostream>
using namespace std;
class Solution {
public:
/**
* @param s an expression includes numbers, letters and brackets
* @return a string
*/
string expressionExpand(string& s) {
// Write your code here
stack<char> ss;//放字符
stack<char> nums;//放次数
string tmp = "";//放字符串,因为如果只有一个的话,复制是指数级的增长,不是一段一段的增长。
string tmp1 = "";//存储被复制的
string result = "";//最后结果
string numstmp = "";//多位数的坑,放多位数
int times = 0;
for(int i = 0; i < s.length(); i++){
if(s[i] == ']'){
while(ss.top() != '['){
char dsd = (char)ss.top();
tmp1 += dsd;
ss.pop();
}
ss.pop();
times = 0;
if (!nums.empty()) {
nums.pop();
}
numstmp = "";
while(!nums.empty() && nums.top() != '['){
numstmp += nums.top();
nums.pop();
}
reverse(numstmp.begin(), numstmp.end());
times = atoi(numstmp.c_str());
reverse(tmp1.begin(), tmp1.end());
if(times == 0){
tmp1 = "";
}else if (times == 1){
for(int j = 0; j < tmp1.length(); j++){
ss.push(tmp1[j]);
}
}else{
for(int j = 0; j < times; j++){
tmp += tmp1;
}
for(int j = 0; j < tmp.length(); j++){
ss.push(tmp[j]);
}
}
tmp = "";
tmp1 = "";
}else{
if(isNum(s[i])){
nums.push(s[i]);
continue;
}else{//是[
ss.push(s[i]);
if (s[i] == '[') {
nums.push(s[i]);
}
}
}
}
while(!ss.empty()){
result+=ss.top();
ss.pop();
}
reverse(result.begin(), result.end());
return result;
}
bool isNum(char s){
int tmp = s - '0';
if (tmp >= 0 && tmp <= 9){
return true;
}
return false;
}
};