-1

中置から後置への変換用のコードを作成しました。このコードではコンパイル時エラーは発生していませんが、入力中置式を取得した後、これらのエラーが文字列に関連するものであることを理解できない実行時エラーが発生しています。メッセージが言うように。

#include<iostream>
#include<string>

#define N 50
using namespace std;

class stack
{
private:
    char arr[N];
    int tos;

public:
    void push(char p)
    {
        if (tos != N)
            arr[++tos] = p;
        else
            cout << "stack full";
    }

    char pop()
    {
        if (tos == -1)
            cout << "stack Empty";
        else
            return (arr[tos--]);
    }

    bool isempty()
    {
        if (tos == -1)
            return (true);
        else 
            return (false);
    }

    char top()
    {
        return arr[tos];
    }

    stack()
    {
        tos = -1;
    }
};

int pres(char sym)
{
    if (sym == '^')
        return 3;
    else if (sym == '*' || '/')
        return 2;
    else if (sym == '+' || '-')
        return 1;
    else if (sym == '(')
        return 0;
} 

bool isoperator(char op)
{
    if (op=='+' || op=='-' || op=='/' || op=='*' || op=='^')
        return true;
    else
        return false;
}

int main()
{
    string infix, postfix;
    stack s;
    int in=0;
    int post=0;

    cout << "Enter an infix expression: ";
    cin >> infix;
    s.push('(');
    infix.append(")");
    char temp;

    while (!(s.isempty()))
    {
        if (isdigit(infix[in]))
            postfix[post++] = infix[in];
        else if (infix[in] == '(')
            s.push(infix[in]);
        else if (infix[in] == ')')
        {
            while (1)
            {
                temp = s.pop();
                if (temp == '(')
                    break;
                else
                    postfix[post] = infix[in];
            }
        }
        else if (isoperator(infix[in]))
        {
            while (pres(s.top()) >= pres(infix[in]))
                postfix[post++] = s.pop();

            s.push(infix[in]);
        }
        in++;
    }

    cout << "Postfix expression is: " << postfix;
    system("pause");

}

何が悪いのかわかりません。誰でも助けることができますか??

4

2 に答える 2

2

コードに次の論理エラーが見つかりました:

  • 結果の文字列postfixは最初は空ですが、を使用して単一の文字位置に書き込んでいますpostfix[post++]=。これは有効ではなく、おそらく「文字列関連」のエラーを引き起こしています。postfix.push_back()出力文字列に文字を追加する場合にのみ使用してください。
  • 最初の内部whileループ ( while(1)) で、最後のステートメントは次のようになります。

    postfix.push_back(temp);

    スタックから出力に演算子を追加したいからです。

  • あなたのコードは、「1+4)」のような不均衡な追加の閉じ親を含む入力を誤って受け入れます。個人的には、入力位置を外側のループ条件として配置し、ループ後にスタックが空であることを確認して (pop()関数内の空のスタックをチェックして)、入力エラーを検出します。
于 2011-10-09T15:54:40.640 に答える
1

最大のエラーは彼の pres() 関数にあります。次のようになります。

else if (sym == '*' || sym == '/')
else if (sym == '+' || sym == '-')

MartinStettner によって言及されたエラーのいくつかに気付きました。

于 2011-10-09T15:58:28.390 に答える