逆波兰表达式
逆波兰表达式又叫做做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个对象之间,这是中缀表达式,而逆波兰表达式是每一运算符都置于其运算对象之后
,所以称为后缀表达式。
,所以称为后缀表达式。
举例:中缀:4+5
后缀:4 5 +
逆波兰表达的式的实现原理要用到栈的这种数据结构。
算法:输入你要计算的逆波兰表达式,然后以此读取判断,如果是数字则将其压栈,如果读取到‘+’,‘-’,‘*’,‘/’,其中的一个,将之前压栈的数据出栈然后进行对用的运算操作,再将其压栈。然后继续向后读取重复之前的判断操作。
简单举例如下:
我自己的代码是可以计算浮点数的逆波兰达表达,所以要进行浮点数的读取的代码并且在上述图的基础上增加一个中间转换器将数字转换为浮点数然后压栈进去,这个中间转换器我用数组来代替。
具体实现的代码如下:
void Solution()
{
char input;
double d, e;
char arr[10];
int i = 0;
stack stack1;
Initstack(&stack1);
printf("请输入逆波兰表达式,单独数字之间用空格隔开,按#号健结束:");
scanf("%c", &input);
while (input!='#')
{
while (isdigit(input) || input == '.')//获取小数和整数转换为浮点数的转换器
{
arr[i++] = input;
arr[i] = '\0';
scanf("%c", &input);
if (input == ' ')
{
d = atof(arr);//将字符串转换为浮点数
pushstack(&stack1, d);
i = 0;
break;
}
}
switch (input)//计算器
{
case '+':
{
popstack(&stack1, &d);//出栈
popstack(&stack1, &e);
pushstack(&stack1, d + e);//压栈
break;
}
case '-':
{
popstack(&stack1, &d);
popstack(&stack1, &e);
pushstack(&stack1, e-d);
break;
}
case '*':
{
popstack(&stack1, &d);
popstack(&stack1, &e);
pushstack(&stack1, e*d);
break;
}
case '/':
{ popstack(&stack1, &d);
popstack(&stack1, &e);
if (d != 0)
{
pushstack(&stack1, e / d);
}
else
{
printf("出错,除数为0");
return;
}
break;
}
default:
break;
}
scanf("%c", &input);
}
popstack(&stack1, &d);
printf("计算结果:%.2lf\n", d);
}
测试如下数据:
1. (3.14+2.48)*2.5+6 2.(4+5)*2-10