2

割り当てのために、逆ポーランド記法で方程式が与えられます。この例では、次を使用します。 は、式の終わりを示すためのものです2 3 8 * + $$スタックを使用して、答えを出力します。

私は使用しています:

getline(cin, input, '&');
input.c_str();

式を読み取り、それを c_string に変換して、入力内の個々の要素を確認できるようにします。

その後、いくつかのことを確認する必要があります。要素が数字の場合、スタックにプッシュする必要があります。空白の場合はスキップする必要があります。

if (isdigit(input[i]))
{
    push();
    i++;
}
else if (isspace(input[i]))
{
    i++;
}

今私が立ち往生しているものです。演算子 (この場合は*) をヒットした場合、上位 2 つの要素をスタックからポップして「操作」し、結果をスタックにプッシュする必要があります。しかし、彼らがオペレーターであると認識できるようなものは何も知りません。ばかげた質問かもしれませんが、助けていただければ幸いです。

4

4 に答える 4

0

オペレーターは4~5人程度です。次のようなものでそれらを確認してください:

if (input[i] == '*') {...}
于 2012-10-03T18:16:01.643 に答える
0

逆ポーランド記法計算機を書いている場合、スタックには数字、または例のような数字しかありません。ところで、複数桁の数字を受け入れませんか?

2 つのケースを考えてみましょうstd::stack<int> numbers;

  • あなたは数字の文字を持っていますc- 数字をスタックに置くだけです:

コード:

numbers,push(c - '0');
  • 演算子があり、「+」としましょう。上位 2 つの数値をその合計に置き換えます。

コード:

 if (numbers.size() < 2) {
     throw std::runtime_error("Too little numbers for +");
 }
 int a = numbers.top(); 
 numbers.pop();
 numbers.top() += a;
  • 「$」があります。スタックに数字が 1 つしかないかどうかを確認してください。結果は次のとおりです。

コード:

  if (numbers.size() != 1) {
     throw std::runtime_error("There should be only one!");
   }
   int result = numbers.top();
   numbers.pop(); 
于 2012-10-03T20:51:56.717 に答える
0

まあ、「組み込み」の方法はありません。IsOperator(char ch) 関数を書くだけです。そして、次のようにします。

int IsOperator(char ch)
{
    // either add more operators or use a table, etc. here
    if (ch == '+' || ch == '-' || ch == '/' || ch == '*')
      return 1;

    return 0;
}

「==」のような複数文字の演算子がある場合、先をのぞく必要があるため、少し複雑になりますが、考え方は同じです。

于 2012-10-03T18:19:32.733 に答える