鱼C论坛

 找回密码
 立即注册
查看: 3517|回复: 2

[技术交流] 利用后缀计算表达式(RPN.c)

[复制链接]
发表于 2015-12-18 22:49:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <stdlib.h>
  4. #include <ctype.h>
  5. #include <conio.h>
  6. #include <math.h>

  7. // 存放操作数的栈
  8. struct StackNode
  9. {
  10.         float data;
  11.         struct StackNode *next;
  12. };

  13. void Push(struct StackNode **, float);
  14. void Pop(struct StackNode **, float *);

  15. void main()
  16. {
  17.         // top指向存放操作数栈的栈顶
  18.         struct StackNode *top = NULL;
  19.         // 保存从键盘缓冲区获取的临时字符变量
  20.         char ch;
  21.         // 变量i记录一个数字串的长度(浮点数包括小数点)
  22.         int i=0;
  23.         // 变量j记录一个浮点数数字串小数点位数
  24.         int j=0;
  25.         // 保存每次从栈中弹出的数据
  26.         float e;
  27.         // 参与运算的两个操作数
  28.         float a, b;
  29.         // 从键盘缓冲区中分离出要入栈的操作数
  30.         float val=0;
  31.         printf("请输入逆波兰表达式, 参与运算的各对象之间用空格隔开,以回车结束输入: \n");
  32.         scanf("%c", &ch);
  33.         while(ch!='\n')
  34.         {
  35.                 // 处理被空格分割开的空格之前的一个操作数
  36.                 if(ch==' ')
  37.                 {
  38.                         if(i>=2)
  39.                         {
  40.                                 while(i--)
  41.                                 {
  42.                                         Pop(&top, &e);
  43.                                         if( (char)e=='.' )
  44.                                         {
  45.                                                 // 计算小数点后的各位数字表示的数据大小
  46.                                                 val /= (float)pow(10, j);
  47.                                                 j = 0;
  48.                                                 continue;
  49.                                         }
  50.                                         // 小数点后的数据加上小数点前的数据即为一个浮点操作数的大小
  51.                                         val += e*(float)pow(10, j++);
  52.                                 }
  53.                                 // 小数点位数清零
  54.                                 j = 0;
  55.                                 // 将操作数入栈
  56.                                 Push(&top, val);
  57.                                 // 操作数清零
  58.                                 val = 0;
  59.                         }
  60.                         // 数字串长度清零
  61.                         i = 0;
  62.                         // 过滤掉空格
  63.                         while(ch == ' ')
  64.                         {
  65.                                 scanf("%c", &ch);
  66.                         }
  67.                 }
  68.                 // 数字字符入栈
  69.                 if(isdigit(ch))
  70.                 {
  71.                         Push(&top, (float)(ch-48));
  72.                         i++;
  73.                 }
  74.                 else
  75.                 {
  76.                         // 碰到运算符时, 先从栈中弹出两个操作数
  77.                         // 对其做相应的运算, 并将计算的结果入栈
  78.                         switch(ch)
  79.                         {
  80.                         case '+':
  81.                                 {
  82.                                         Pop(&top, &a);
  83.                                         Pop(&top, &b);
  84.                                         Push(&top, b+a);
  85.                                         break;
  86.                                 }
  87.                         case '-':
  88.                                 {
  89.                                         Pop(&top, &a);
  90.                                         Pop(&top, &b);
  91.                                         Push(&top, b-a);
  92.                                         break;
  93.                                 }
  94.                         case '*':
  95.                                 {
  96.                                         Pop(&top, &a);
  97.                                         Pop(&top, &b);
  98.                                         Push(&top, b*a);
  99.                                         break;
  100.                                 }
  101.                         case '/':
  102.                                 {
  103.                                         Pop(&top, &a);
  104.                                         Pop(&top, &b);
  105.                                         if(!a)
  106.                                         {
  107.                                                 printf("除数不能为零!!\n");
  108.                                                 exit(0);
  109.                                         }
  110.                                         Push(&top, b/a);
  111.                                         break;
  112.                                 }
  113.                         // 小数点符号入栈
  114.                         case '.':
  115.                                 {
  116.                                         Push(&top, (float)ch);
  117.                                         i++;
  118.                                         break;
  119.                                 }
  120.                         default:
  121.                                 {
  122.                                         printf("您输入的运算符有误!!\n");
  123.                                         exit(0);
  124.                                 }
  125.                         }
  126.                 }
  127.                 scanf("%c", &ch);
  128.         }
  129.         Pop(&top, &e);
  130.         printf("该表达式的结果为: %.2f\n", e);
  131.         _getch();
  132. }

  133. void Push(struct StackNode **top, float e)
  134. {
  135.         struct StackNode *p = (struct StackNode *)malloc(sizeof(struct StackNode));
  136.         p->data = e;
  137.         p->next = *top;
  138.         *top = p;
  139. }

  140. void Pop(struct StackNode **top, float *e)
  141. {
  142.         struct StackNode *p = *top;
  143.         if(p==NULL)
  144.         {
  145.                 printf("下溢!\n");
  146.                 exit(0);
  147.         }
  148.         *e = p->data;
  149.         *top = p->next;
  150.         free(p);
  151. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-12-18 23:00:07 | 显示全部楼层
支持楼主、。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-18 23:13:01 | 显示全部楼层
谢谢分享
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-13 12:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表