タイトル説明
シンプルな表現文字列を評価するための基本的な電卓を実装します。
式の文字列は、オープン含まれていてもよい (
し、終値括弧 )
、プラス +
またはマイナス記号 -
、非negativeintegersと空のスペースを 。
効果の対象に
基本的な電卓、入力文字列を実装し、文字列のみが「0-9」を含んでいます、「+」、「 - 」、」。
例
E1
E2
E3
問題解決のためのアイデア
唯一、我々は慎重のようにすべての可能な状況を考える必要があり、複雑なアルゴリズムをどのような基本的な必要があります。
たとえば、
デジタル入力は、整数の数が存在してもよい、一桁を配置することができます。
負の入力の存在下で、
余分なスペースの複数の入力、位置不確定性領域があります。
デジタル入力「+」の前に過剰の正の数を表します。
...
溶液は、任意の過剰のオペレータ前数は正と負の数を表す場合、デジタルを挿入しながら、空白の文字列が、削除された文字列を初期化することである「0」正常な動作を指示するために、(計算され、例えば、便宜の入力後されている " - 2 + 1")は、 "0-2 + 1" として扱われます。基本演算の後に行われる操作は、プッシュポップ操作することができます。
複雑性分析
時間複雑:O(N)
宇宙複雑:O(N)
コード
クラス解決{ パブリック: int型の計算(ストリングS){ INIT(S); // 文字列を横断するとき、演算スタックとオペランドが検出された演算子')括弧内の演算結果を // 計算、および場合スタック INT LEN = s.length(); のため(int型 I = 0 ;私は<LEN; ++ I){ IF(S [I]> = ' 0 ' && S [I] <= ' 9 ' ){ int型 TMP = S [I] - ' 0 '、J = I + 1。; 一方(S [j]> = ' 0 ' && S [J] <= ' 9 ' ){ TMP * = 10 。 TMP + = S [J] - ' 0 ' 。 ++ J; } num.push(TMP)。 I = J - 1 。 } 他{ もし、(S [I] == ' (' ){ op.push(S [I]); } そうでない 場合(S [I] ==' )' ){ CAL(); } 他{ op.push(S [I]); } } } CAL(); 戻り(num.topを); } // プロセス元の文字列、正常に準拠します運用ルールが 無効のinit(文字列&S)を{ BOOL Fは= trueに、 文字列 :: =イテレータITERのs.beginを(); しばらく(!= ITER s.end()){ IF(* ITER == ' '){ s.erase(ITER)。 } そう であれば(* ITER> = ' 0 ' && * ITER <= ' 9 ' ){ F = 偽。 ++ ITER; } そう であれば(* ITER =!' (' && * ITER =!' )' ){ 場合(F){ s.insert(ITER、' 0 ' )。 F = 偽; 他{ Fは = trueに; } ++ ITERを; } 他{ ++ ITER; } } } // スタックの最初のための基本操作を行う、ノートは、別のスタック・オペランドの演算木を保持するために使用されるべきです // (左から右へ)動作のための、従って順次変更しなければならないことがないようにするため ボイドCAL(){ スタック < INT > ; tmp_nを スタック < チャー > tmp_o; 一方(num.size()> 1 ){ IF( op.top()== "(' ){ op.pop()。 破ります; } tmp_n.push(num.top())。num.pop(); tmp_o.push(op.top())。op.pop(); } tmp_n.push(num.top())。num.pop(); しばらく(!tmp_o.empty()){ int型、B; チャー O = tmp_o.top()。 tmp_o.pop(); = tmp_n.top()。tmp_n.pop(); B = tmp_n.top()。tmp_n.pop(); tmp_n.push(O == ' + ' A + B:? - B)。 } num.push(tmp_n.top())。 } プライベート: スタック < int型 > NUM; スタック < 文字 > OP。 }。