-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 回答