我已经编写了一个用于后缀转换的中缀的代码,这段代码没有遇到任何类型的编译时错误但是在获取输入中缀表达式之后它给出了一些运行时错误,我无法理解这些错误是什么的与消息所说的字符串相关。
#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");
}
我无法弄清楚它有什么问题。任何人都可以帮忙吗?
答案 0 :(得分:2)
我在您的代码中发现了以下逻辑错误:
postfix
在开头是空的,但您使用postfix[post++]=
写入单个字符位置。这是无效的,并且可能导致“字符串相关”错误。您只应使用postfix.push_back()
在输出字符串中添加字符。在第一个内部while
循环(while(1)
)中,最后一个语句应该是
postfix.push_back(temp);
因为您想要将堆栈中的运算符附加到输出。
pop()
函数中的空堆栈)以检测输入错误。答案 1 :(得分:1)
最大的错误在于他的pres()函数,它应该是:
else if (sym == '*' || sym == '/')
else if (sym == '+' || sym == '-')
我注意到MartinStettner提到的一些错误。