编写一个程序,接收仅包含字符.
和的奇数长度的字符串:
。借助最初为空的堆栈,从该字符串生成一个数字,如下所示:
对于字符串中的每个字符c(从左到右)...
- 如果c是
.
并且堆栈中的元素少于2个,则将1推入堆栈。 - 如果c是
.
并且堆栈中有2个或更多元素,请从堆栈中弹出两个顶部值,并将它们的和推入堆栈中。 - 如果c是
:
并且堆栈中的元素少于2个,则将2推入堆栈。 - 如果c为
:
且堆栈具有2个或多个元素,请从堆栈中弹出两个顶部值,然后将其乘积推入堆栈。
结果数字是堆栈顶部的值。您的程序应将此编号打印到标准输出(带有可选的尾随换行符)。
(少量分析表明,除非字符串的长度为偶数,否则将仅剩一个数字,这就是我们忽略这些数字的原因。实际上,堆栈中最多不会包含2个元素。)
例如,数字为::...:.:.
9:
2 1 2 2 /______ stack just after the character below is handled
2 2 4 4 5 5 7 7 9 \
: : . . . : . : . <-- string, one character at a time
为了进行完整性检查,以下是所有长度为1、3和5的字符串的数字:
. 1
: 2
... 2
..: 1
.:. 3
.:: 2
:.. 3
:.: 2
::. 4
::: 4
..... 3
....: 2
...:. 4
...:: 4
..:.. 2
..:.: 1
..::. 3
..::: 2
.:... 4
.:..: 3
.:.:. 5
.:.:: 6
.::.. 3
.::.: 2
.:::. 4
.:::: 4
:.... 4
:...: 3
:..:. 5
:..:: 6
:.:.. 3
:.:.: 2
:.::. 4
:.::: 4
::... 5
::..: 4
::.:. 6
::.:: 8
:::.. 5
:::.: 4
::::. 6
::::: 8
以字节为单位的最短程序获胜。Tiebreaker是较早的帖子。
- 您可以假设输入始终有效,即,仅包含
.
且:
长度为奇数的字符串。 - 除了编写程序外,您还可以编写一个函数,该函数接受有效的字符串并打印或返回生成的数字。