1

ユーザー入力を受け取り、スタックを使用して優先順位に基づいて中置式を後置式に変換するプログラムを作成しています。オペランドは常に演算子の前に置かれます。たとえば、ユーザーが次のように入力した場合:

(a+b*c)

次に、プログラムは次のように表示されます。

abc*+

これまでのところ、私はこれを持っています:

#include <iostream>
#include <stack>
#include <string>


using namespace std;

int main()
{
    stack<char> s;
    char input;
    while (cin.get(input) && input != '\n')
        {
            if (isalnum(input))
                cout << input << "\n";
            else if (input == '(')
                s.push(input);
            else if (input == ')')
            {
        while (!s.empty() && s.top() != '(')
            {
            cout << s.top();
            s.pop();
        }
            if(!s.empty()) 
                    s.pop();
            else
                cout << "ERROR: No Matching ( \n";
        }
     else if (s.empty() && input == '*'||'/'||'+'||'-' && s.top() < input) // Error Begins Here?
     {
         char a = '*';
         char b = '/';
         char c = '+';
         char d = '-';
         bool prec (char a, char b, char c, char d);
             return ('*' > '/' > '+' > '-');
             s.push(input);
     }
         else if (input == '*'||'/'||'+'||'-' && s.top() >= input)
             while (!s.empty()) 
          {
              cout << s.top();
          s.pop();
                  s.push(input);
          }
        }
    while (!s.empty())
    {
        cout << s.top();
        s.pop();
    }
}

コンパイルして実行しますが、正常に機能していません。「ab」のような式を入力すると、本来「ab」と表示されるのですが、「a+b+c」と入力すると「a」しか表示されません。これは、後で表示するためにプログラムが演算子をスタックに配置していないことを意味します。私が助けを必要としているのは、プログラムを変更して、演算子が入力されたときにスタックに追加され、入力が完了したときにオペランドの後に優先順位 (*>/>+>-) に基づいて表示されるようにすることです。

私は一般的にC++とプログラミングにまったく慣れていないので、どんな提案でも素晴らしいでしょう.

4

3 に答える 3

2
else if (input == '*'||'/'||'+'||'-' && s.top() >= input)

これはあなたが思っていることをしません。あなたがする必要があります

else if (input == '*'|| input == '/'|| input == '+'|| input == '-' && s.top() >= input)

そして、これもエラーのように見えます

bool prec (char a, char b, char c, char d);

これが関数プロトタイプの構文です。これでコンパイルしてもよろしいですか?

于 2011-01-23T07:54:17.377 に答える
2

問題はここにあります:

bool prec (char a, char b, char c, char d);
return ('*' > '/' > '+' > '-');

これは優先順位関数を定義することを意図していると思いますが、それはそれがしていることではありません。最初の行はそのような関数が存在することを宣言し (そしてその引数は前の行で宣言された変数とは何の関係もありません)、2 番目の行はプログラム全体を終了させます。このような関数が必要な場合は、外部で定義する必要がありますmain

少し劇的ではないバグがここにあります:

if (s.empty() && input == '*'||'/'||'+'||'-' && s.top() < input)

まず、この部分

input == '*'||'/'||'+'||'-'

と解釈されます

(input == '*') || ('/') || ('+') || ('-')

最後の 3 つの条件は真ですが、最初の条件は無関係です。s.top()s が空の場合はどうなるかさえわかりません。

これで十分です。すべてを 1 つのプログラムにまとめる前に、たとえば、演算子を識別してその優先順位を評価できるルーチンを作成してテストすることから始めることをお勧めします。

于 2011-01-23T08:20:11.703 に答える
0

Falmarri はまさに私の自己を投稿したかっただけで、それをコンパイルしてみましたが、別のことがあります else if (s.empty() && input == '*'||'/'||'+'||'-' && s.top() < input) // Error Begins Her。私がそれを実行すると、次の場所で停止するだけなので、そのポイントに到達したことは確かですか。

while (cin.get(input) && input != '\n')

Enter キーを押すまでは、さらに cin.get(input) でコンソールから複数の文字を入力できますが、入力には最初に入力した文字のみが含まれます。これを解決するに #include <conio.h>は、最初に使用済みを入れます

while ((input = getch()) && input != (char)13) in staid of you're code  

簡単な説明

getch()

一文字だけ押すと戻り、

getch() は ENTER に対して (char)13 を返すため、input != (char)13 は入力 != '\n' の staid に必要です。詳細については、ASCII テーブルを参照してください。

于 2011-01-23T08:10:19.910 に答える