Не удалось найти способ сделать это в короткие сроки (и не проделал забавный алгоритм в то время). Я решил реализовать стек, поскольку он на самом деле менее сложный, чем стек математической операции.
Возвращаясь назад через стек, вам нужно только знать о нескольких вещах, поскольку это принципиально модифицированная реализация общего решения для разбора математического утверждения.
1) Ваше целое число суффикс может быть построен из нескольких символов
2) Ваше число суффикс может быть мультипликатором (следующий символ будучи «)»)
3) Вы должны обращаться за неявные «1» s
Реализация выдает символы из одного стека и толкает только буквы и цифры в ваш «стек возврата».
String expandFormula(String s){
Stack<Character> stack = new Stack();
Stack<Character> hanoi = new Stack();
char[] ca = s.toCharArray();
Character c;
List<Integer> multipliers = new ArrayList();
String multiBuff;
int val;
boolean flag;
for (int i = 0; i < ca.length; i++)
stack.push(ca[i]);
while(!stack.isEmpty()){
c = stack.pop();
if (Character.isLetter(c)){
try{
//previous parse was end of Symbol, implicit "1"
flag = Character.isUpperCase(hanoi.peek());
}
catch(EmptyStackException ese){ //change exception
flag = false;
}
//push implicit 1
if (flag){
stack.push(c);
stack.push('1');
}
//continue as usual
else
hanoi.push(c);
}
//begin number parsing
else if(Character.isDigit(c)){
flag = false;
multiBuff = c +"";
//parse the integer out
while(Character.isDigit(stack.peek())){
c = stack.pop();
multiBuff = c + multiBuff;
}
//if next char is), then value is a suffix
if (stack.peek() == ')'){
flag = true;
stack.pop();
multipliers.add(Integer.parseInt(multiBuff));
//pop successive)s
while(stack.peek() == ')'){
stack.pop();
multipliers.add(1);
}
}
if(Character.isLetter(stack.peek())){
val = flag ? 0 : Integer.parseInt(multiBuff);
//get full value of
for(Integer i : multipliers){
if (val == 0)
val = i;
else
val *= i;
}
//trim and push first decibit
while(val > 0){
hanoi.push(Character.forDigit(val % 10, 10));
val /= 10;
}
}
}
//end of nest, remove most recent multiplier
else if(c == '(')
try{
multipliers.remove(multipliers.size()-1);
}
catch(ArrayIndexOutOfBoundsException aioobe){
}
}
multiBuff = "";
while(!hanoi.isEmpty())
multiBuff += hanoi.pop();
return multibuff;
}
Это решение может быть преобразован непосредственно в свой выходной строки с помощью:
1) Изменение "ханой" в строку
2) Изменение "hanoi.push (с)" Ханойский = C + Ханоя
3) Изменение "hanoi.peek()" в "hanoi.charAt (0)"
4) Изменение исключения по мере необходимости (или использовать общие исключения в любом случае)
5) Просто вернуться Ханоя вместо multibuff вещи на дно.