【发布时间】:2019-04-04 03:41:35
【问题描述】:
我正在使用 +、-、*、/ 和 ^ 运算符编写用于后缀表达式求值的代码。它应该将来自命令行的输入作为字符串作为表达式的后缀表示法(空格用作分隔符)。程序应该在控制台上打印表达式的结果。
我编写的代码适用于所有具有整数值的测试用例。例如。它适用于输入:2 2 2 * + 我试图将堆栈输入值更改为浮点而不是 int,但它仍然不起作用。
using namespace std;
struct node
{
float data ;
node *next ;
};
class stack
{
private :
node *head;
public :
stack()
{
head = NULL;
}
void push(float a)
{
node * temp = new node();
temp ->data = a ;
temp -> next = head ;
head = temp ;
}
int pop()
{
node *temp = head ;
head = temp->next ;
int a = temp->data ;
delete temp;
return a;
}
int see_top()
{
if(is_empty())
return 0 ;
node * temp = head ;
return (temp->data);
}
int is_empty()
{
if(head == NULL)
return 1;
else
return 0 ;
}
};
int is_digit(char a)
{
if(a >= '0' && a<= '9')
return 1;
else
return 0;
}
int is_operand(char a)
{
switch(a)
{
case '+' :
case '-' :
case '*' :
case '/' :
case '^' : return 1;
default : return 0;
}
}
float operation(float a , float b , char sym)
{
float ans ;
switch(sym)
{
case '+' : ans = a + b ;
break;
case '-' : ans = a - b ;
break ;
case '*' : ans = a*b ;
break ;
case '/' : ans = a/b ;
break ;
case '^' : ans = pow(a,b) ;
break ;
default : break ;
}
return ans ;
}
int main()
{
char exp[100];
stack s ;
float num=0 , num1=0 , num2=0 ;
int l , i ;
cout << "Enter the posfix expression : ";
cin.getline(exp,100);
l=strlen(exp);
for(i=0;i<l;i++)
{
if(is_digit(exp[i]))
{
num = 0;
while(exp[i]!=' ')
{
int a = exp[i++]- '0';
num = 10*num + a ;
}
s.push(num);
}
else if(is_operand(exp[i]))
{
num2 = s.see_top();
s.pop();
num1 = s.see_top();
s.pop();
num = operation(num1 , num2 , exp[i]);
s.push(num);
}
else
continue;
}
num = s.see_top();
s.pop();
cout << "Answer : " << num ;
return 0 ;
}
当我尝试输入带有一些浮点值的表达式时,它不会返回正确的值。例如。理想情况下,对于表达式 0.5 0.5 *,它应该返回 0.25,但它应该返回 225。对于表达式 0.1 0.1 +,它返回 -36。
【问题讨论】:
-
也许从尝试实际检测输入中的小数点并处理它开始。然后看看你是否有任何应该包含实数的变量仍然声明为
int。 -
你努力了多少?我之所以问是因为您显然是在逐个字符地处理输入,但不努力考虑小数点和随之而来的潜在小数部分。考虑到这种架构,将堆叠结构类型中的
int更改为float只是您既定目标的冰山一角。
标签: c++