利用后缀计算表达式(RPN.c)
#include <stdio.h>#include <malloc.h>
#include <stdlib.h>
#include <ctype.h>
#include <conio.h>
#include <math.h>
// 存放操作数的栈
struct StackNode
{
float data;
struct StackNode *next;
};
void Push(struct StackNode **, float);
void Pop(struct StackNode **, float *);
void main()
{
// top指向存放操作数栈的栈顶
struct StackNode *top = NULL;
// 保存从键盘缓冲区获取的临时字符变量
char ch;
// 变量i记录一个数字串的长度(浮点数包括小数点)
int i=0;
// 变量j记录一个浮点数数字串小数点位数
int j=0;
// 保存每次从栈中弹出的数据
float e;
// 参与运算的两个操作数
float a, b;
// 从键盘缓冲区中分离出要入栈的操作数
float 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);
_getch();
}
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]