シンプルな表現文字列を評価するための基本的な電卓を実装します。
式の文字列は、オープン含まれていてもよい (
し、終値括弧 )
、プラス +
またはマイナス記号 -
、負でない整数と空のスペースを 。
例1:
入力: "1 + 1" 出力:2
例2:
入力: "2-1 + 2" 出力:3
例3:
入力: "(1+(4 + 5 + 2)-3)+(6 + 8)" 出力:23
注意:
- あなたは、与えられた式が常に有効であると仮定してもよいです。
- 使用しないでください
eval
内蔵のライブラリ機能を。
何*の/存在しないので、何の優先度が存在しないため、被験者は、それはまだかなりの相対的であるが、()が存在するが、3類似ある - (2--6)は、そのような状況は全く括弧がないとブラケットは、二つの結果であります私たちは、スタックする必要があります。
私たちは、現在のシンボルを示すために署名し、デフォルトは1で、現在の数値結果を表すために、ANS、現在の桁を表すために、一時、初期の兆候とTEMPの最後に各桁、あなたが見れば「(」ANSとAPPENDに署名します内部にスタックサイクル)ANS、イベント '' を計算し続け、それは* = stack.pop()、ANS + = stack.pop()ANS、サイクルが継続します。最後に、ANSを返します。
コード
クラス溶液(オブジェクト): DEF (自己、単数または複数)を計算する: "" " :タイプS:STR :RTYPE:INT """ スタック、数字、N、ANS、記号、TEMP、I = []、" 0123456789 "、 LEN(S)、0、1、"" 、0 ながら、私の< N: もし S [I] == ' - ' : 記号 = -1 のelif S [I] == ' + ' : 符号 = 1つの ELIFの S [I] で数字: ながら、私は、n < と [i]はS 内の数字: TEMP + = S [i]は 、I + = 1つの ANS + =記号* INT(TEMP) 符号、TEMP = 1、"" I - = 1 ELIFの S [I ] == ' (' : stack.append(ANS) stack.append(符号) 符号、ANS = 1 、0 ELIF S [I] == ' )' : ANS * = stack.pop() ANS + = stack.pop() I + = 1つの 戻り ANS