C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++の基本的な電卓III


単純な式の文字列があり、その式を評価するための基本的な計算機を実装する必要があるとします。式の文字列には、開き括弧と閉じ括弧、プラス+またはマイナス記号-、非負の整数、および空のスペースを含めることができます。式の文字列には、負でない整数、+、-、*、/演算子、開き括弧と閉じ括弧、および空のスペースのみが含まれます。整数除算はゼロに向かって切り捨てる必要があります。

したがって、入力が「6-4 / 2」の場合、出力は4になります

これを解決するには、次の手順に従います-

  • l1:=0、l2:=1

  • o1:=1、o2:=1

  • 1つのスタックstを定義する

  • n:=sのサイズ

  • 初期化i:=0の場合、i

    • x:=s [i]

    • x>='0'およびx<='9'の場合、-

      • num:=x-'0'

      • while(i + 1 ='0' and s [i + 1] <='9')、do −

        • (iを1増やします)

        • num:=(num * 10)+(s [i]-'0')

      • l2:=(o2が1と同じ場合、l2 * num、それ以外の場合はl2 / num)

    • それ以外の場合、xが'('と同じ場合、-

      • l1をstに挿入し、o1をstに挿入します

      • l2をstに挿入し、o2をstに挿入します

      • l1:=0、o2:=1

      • o1:=1、l2:=1

    • それ以外の場合、xが')'と同じ場合、-

      • temp:=l1 + o1 * l2

      • o2:=stの最上位要素

      • stから要素を削除

      • l2:=stの最上位要素

      • stから要素を削除

      • o1:=stの最上位要素

      • stから要素を削除

      • l1:=stの最上位要素

      • stから要素を削除

      • l2:=(o2が1と同じ場合、l2 * temp、それ以外の場合はl2 / temp)

    • それ以外の場合、xが「*」と同じまたはxが「/」と同じである場合、-

      • o2:=(xが'*'と同じ場合は1、それ以外の場合は-1)

    • それ以外の場合、xが「+」と同じまたはxが「-」と同じである場合、-

      • xが'-'および(iが0または(i --1> =0およびs[i-1]が'(')と同じ)と同じである場合)、-

        • o1:=-1

        • 次の部分を無視し、次の反復にスキップします

      • l1:=l1 + o1 * l2

      • o1:=(xが'+'と同じ場合は1、それ以外の場合は-1)

      • l2:=1、o2:=1

  • l1 + o1 * l2

    を返します

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
   public:
   int calculate(string s) {
      lli l1 = 0;
      lli l2 = 1;
      lli o1 = 1;
      lli o2 = 1;
      stack<lli> st;
      lli n = s.size();
      for (lli i = 0; i < n; i++) {
         char x = s[i];
         if (x >= '0' && x <= '9') {
            lli num = x - '0';
            while (i + 1 < n && s[i + 1] >= '0' && s[i + 1] <= '9') {
               i++;
               num = (num * 10) + (s[i] - '0');
            }
            l2 = (o2 == 1) ? l2 * num : l2 / num;
         }
         else if (x == '(') {
            st.push(l1);
            st.push(o1);
            st.push(l2);
            st.push(o2);
            l1 = 0;
            o2 = 1;
            o1 = 1;
            l2 = 1;
         }
         else if (x == ')') {
            lli temp = l1 + o1 * l2;
            o2 = st.top();
            st.pop();
            l2 = st.top();
            st.pop();
            o1 = st.top();
            st.pop();
            l1 = st.top();
            st.pop();
            l2 = (o2 == 1) ? l2 * temp : l2 / temp;
         }
         else if (x == '*' || x == '/') {
            o2 = (x == '*') ? 1 : -1;
         }
         else if (x == '+' || x == '-') {
            if (x == '-' && (i == 0 || (i - 1 >= 0 && s[i - 1] == '('))) {
               o1 = -1;
               continue;
            }
            l1 += o1 * l2;
            o1 = (x == '+') ? 1 : -1;
            l2 = 1;
            o2 = 1;
         }
      }
      return l1 + o1 * l2;
   }
};
main(){
   Solution ob;
   cout << (ob.calculate("(5+9*3)/8"));
}

入力

"(5+9*3)/8"

出力

4

  1. C++でのパス合計III

    各ノードが整数キーを保持する二分木を与えたと仮定します。合計して特定の値になるパスを見つける必要があります。パスはルートからリーフまで開始する必要があります。合計が同じになるパスを見つける必要があります。 ツリーが[5,4,8,11、null、13,4,7,2、null、null、5,1]のようで、合計が22の場合、-になります。 パスは[[5,4,11,2]、[5,8,4,5]]です。 これを解決するには、次の手順に従います- この問題を解決するには、dfs関数を使用します。dfsはわずかに変更されています。これは次のように機能します。この関数は、ルート、合計、および1つの一時

  2. C++での基本的なグラフィックプログラミング

    C ++プログラミング言語は、用途の広いプログラミング言語です。 C ++を使用すると、ローエンドのグラフィックを作成することもできます。つまり、スタイリッシュなフォントで基本的な形や単語を作成し、それらに色を追加することは、c++を使用して行うことができます。 グラフィックプログラミングは、ターミナルまたはコマンドプロンプトを使用してC ++で実行できます。または、DevC++コンパイラをダウンロードしてグラフィックプログラムを作成することもできます。 ターミナルの場合は、graphics.hlibrarayをGCCコンパイラに追加する必要があります。このためには、次のコマンドを入力する