繁体   English   中英

后缀到后缀转换的代码

[英]a code for infix to postfix conversion

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

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

}

我无法弄清问题所在。 可以帮忙吗?

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

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

    postfix.push_back(temp);

    因为您要将运算符从堆栈追加到输出。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM