用于中缀到后缀转换的代码

时间:2011-10-09 14:09:30

标签: c++ infix-notation

我已经编写了一个用于后缀转换的中缀的代码,这段代码没有遇到任何类型的编译时错误但是在获取输入中缀表达式之后它给出了一些运行时错误,我无法理解这些错误是什么的与消息所说的字符串相关。

#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");

}

我无法弄清楚它有什么问题。任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

我在您的代码中发现了以下逻辑错误:

  • 结果字符串postfix在开头是空的,但您使用postfix[post++]=写入单个字符位置。这是无效的,并且可能导致“字符串相关”错误。您只应使用postfix.push_back()在输出字符串中添加字符。
  • 在第一个内部while循环(while(1))中,最后一个语句应该是

    postfix.push_back(temp);

    因为您想要将堆栈中的运算符附加到输出。

  • 您的代码错误地接受输入不平衡的其他结束父母,如“1 + 4)”。就个人而言,我会将输入位置作为外部循环条件,并在循环之后验证堆栈是否为空(并检查pop()函数中的空堆栈)以检测输入错误。

答案 1 :(得分:1)

最大的错误在于他的pres()函数,它应该是:

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

我注意到MartinStettner提到的一些错误。