AT_kupc2015_f 逆ポーランド記法

题目描述

## 问题描述 有一种算式的表达方法被称作[逆波兰表达式](//baike.baidu.com/item/%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F/9841727)。在这个问题中,单个数字($0-9$)和加减乘三个双目运算符(`+-*`)被称作“令牌”(`token`)。我们以一串“令牌”组成字符串来表达一个逆波兰式。 举个例子。如果有一个逆波兰记法的表达式 $32-1+$,这个表达式的中缀表达式为 $(3-2)+1$,计算的结果为 $2$。逆波兰表达式的计算方法的伪代码如下给出: ```cpp calc(s) { 初始化一个空的X for (i in [0 .. |s|-1]) { if (s[i]是数字) { X.push(s[i]) } else { r = X.pop() l = X.pop() 求出l和r按照运算符s[i]计算的结果记作a X.push(a) } } ans = X.pop() return ans } ``` 该程序的输入 $s$ 是一个逆波兰式的字符串。$s[i]\quad(0\leq i\leq |s|-1)$ 指 $s$ 的第 $i+1$ “令牌”。 “求出 $l$ 和 $r$ 按照运算符 $s[i]$ 计算的结果记作a”的意思是:$l$ 为左运算数,$r$ 为右运算数,运算符为 $s[i]$,进行加 / 减 / 乘的运算。比如当 $s[i]$ 为 `-` 时,要进行的运算(用中缀表达式表达)为 $l-r$。 应该注意的是:构造后 $X$ 的 `push` / `pop` 操作的有关值均在 $0$ 到 $9$ 的范围的限制之内。当 $X$ 为空时对其进行 `pop` 操作将会导致程序产生错误而停止,不会得到计算的输出。 如果上述代码中构造的 $X$ 是一个栈,那么就应该能正确的计算一个逆波兰表达式;如果错误地使用队列则不能正确的计算。如果将输入的式子进行重新的排列,用队列的程序就应该能够输出正确答案。 我们将 $X$ 为栈的程序称为“$S$ 程序”, $X$ 为队列的程序为“$Q$ 程序”。 给定一个逆波兰式 $A$,要求求出符合以下条件的 $B$: - $B$ 是 $A$ 的一个排列 - 以 $B$ 为输入的 “$Q$ 程序”不会产生错误 - 以 $B$ 为输入的 “$Q$ 程序”的输出与以 $A$ 为输入的“$S$ 程序”的输出相等。

输入格式

一行逆波兰式的字符串 $A$: ``` A ```

输出格式

一行满足题目要求的字符串 $B$(如有多个符合条件的 $B$,任意输出一个): ``` B ``` ## 样例输入输出 ### 样例一 #### 输入 ``` 54- ``` #### 输出 ``` 45- ``` ### 样例二 #### 输入 ``` 321+- ``` #### 输出 ``` 12+3- ``` ### 样例三 #### 输入 ``` 2 ``` #### 输出 ``` 2 ```

说明/提示

- 样例一:对于输入的 $A$ `54-`,仅有一个符合条件的 $B$ 为 `45-` - 样例二:输入 `321+-` 时,“$S$ 程序”得到的中缀表达式为 `3-(2+1)`,最终的输出为 $0$。 - 样例三:单个数字的字符串也是一个正确的逆波兰式。 - $1\leq A\leq100$ - $A$ 是仅含有 `0123456789+-*` 的字符串 - 保证 $A$ 是合法的逆波兰式。 - 题目来源:[京都大学2015程序大赛](//www.kupc.jp/)