中缀到后缀转换的代码

a code for infix to postfix conversion

本文关键字:代码 转换 后缀 中缀      更新时间:2023-10-16

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

#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提到的一些错误