可以计算浮点数的逆波兰表达式计算器,RPN
本帖最后由 spy 于 2015-12-20 00:42 编辑#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
struct StackNode
{
float data;
struct StackNode *next;
};
void Push(struct StackNode **, float);
void Pop(struct StackNode **, float *);
void main()
{
struct StackNode *top = NULL;
char ch;
int i=0, j=0;
float e, a, b, val=0;
printf("请输入逆波兰表达式, 参与运算的各对象之间用空格隔开,以回车结束输入: \n");
scanf("%c", &ch);
while(ch!='\n')
{
if(ch==' ')
{
if(i>=2)
{
while(i--)
{
Pop(&top, &e);
if( (char)e=='.' )
{
val /= (float)pow(10, j);
j = 0;
continue;
}
val += e*(float)pow(10, j++);
}
j = 0;
Push(&top, val);
val = 0;
}
i = 0;
while(ch == ' ')
{
scanf("%c", &ch);
}
}
if(isdigit(ch))
{
Push(&top, (float)(ch-48));
i++;
}
else
{
switch(ch)
{
case '+':
{
Pop(&top, &a);
Pop(&top, &b);
Push(&top, b+a);
break;
}
case '-':
{
Pop(&top, &a);
Pop(&top, &b);
Push(&top, b-a);
break;
}
case '*':
{
Pop(&top, &a);
Pop(&top, &b);
Push(&top, b*a);
break;
}
case '/':
{
Pop(&top, &a);
Pop(&top, &b);
if(!a)
{
printf("除数不能为零!!\n");
exit(0);
}
Push(&top, b/a);
break;
}
case '.':
{
Push(&top, (float)ch);
i++;
break;
}
default:
{
printf("您输入的运算符有误!!\n");
exit(0);
}
}
}
scanf("%c", &ch);
}
Pop(&top, &e);
printf("该表达式的结果为: %.2f\n", e);
}
void Push(struct StackNode **top, float e)
{
struct StackNode *p = (struct StackNode *)malloc(sizeof(struct StackNode));
p->data = e;
p->next = *top;
*top = p;
}
void Pop(struct StackNode **top, float *e)
{
struct StackNode *p = *top;
if(p==NULL)
{
printf("下溢!\n");
exit(0);
}
*e = p->data;
*top = p->next;
free(p);
} 长见识了 就是来顶 支持
就是来顶 支持 牛批!
页:
[1]