鱼C论坛

 找回密码
 立即注册
查看: 2913|回复: 0

[学习笔记] 《数据结构和算法》——逆波兰表达式

[复制链接]
发表于 2017-7-31 13:57:26 | 显示全部楼层 |阅读模式

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

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

x
对于所求的中缀表达式,我们首先需要将其转换为后缀表达式,即将运算符写在作用的两个数的后面,然后将中缀表达式的输出作为后缀表达式计算程序的输入。
在一个中缀表达式,我们首先需要用栈来储存级别较高的运算符,如*,(等。在栈中只允许级别较高的运算符在级别较低的运算符上面,所以当读取到级别最低级别最低的“+”和“-”时就将栈中的运算符弹出至“(”或栈为空,“(”可以在任何运算符下面,一旦检测到“)”立刻将栈中的运算符弹出,至“(”的位置。当检测到“*”和“/”时则压入栈中。当输入完毕后将栈中所有符号弹出。


附上计算中缀表达式的算法:
  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<math.h>
  4. #include<iostream>
  5. using namespace std;

  6. typedef double elem;

  7. class stack1
  8. {
  9. public:
  10.         elem *top, *base;
  11.         int stack_size;
  12. };

  13. class stack2
  14. {
  15. public:
  16.         char *top, *base;
  17.         int stack_size;
  18. };

  19. void Initial(stack1 *s)
  20. {
  21.         s->base = new elem[1000];
  22.         s->top = s->base;
  23.         s->stack_size = 0;
  24. }
  25. void Initial(stack2 *s)
  26. {
  27.         s->base = new char[1000];
  28.         s->top = s->base;
  29.         s->stack_size = 0;
  30. }


  31. void Push(stack1 *s,elem e)
  32. {
  33.         *(s->base) = e;
  34.         s->base++;
  35.         s->stack_size++;
  36. }
  37. void Push(stack2 *s, char e)
  38. {
  39.         *(s->base) = e;
  40.         s->base++;
  41.         s->stack_size++;
  42. }

  43. void Pop(stack1 *s,double *e)
  44. {
  45.         s->stack_size--;
  46.         s->base--;
  47.         *e = *(s->base);
  48. }
  49. void Pop(stack2 *s,char *e)
  50. {
  51.         s->base--;
  52.         s->stack_size--;
  53.         *e = *(s->base);
  54. }


  55. int main()
  56. {
  57.         stack1 s;
  58.         stack2 r;
  59.         char c;
  60.         char str[20];
  61.         elem d;
  62.         Initial(&s);
  63.         Initial(&r);

  64.         printf("输入要计算的中缀表达式(以#结束,数字与符号之间用空格隔开):");
  65.         scanf_s("%c", &c);

  66.         while (c!= '#')
  67.         {
  68.                 int i = 0;
  69.                 while (isdigit(c) || c == '.')
  70.                 {
  71.                         str[i++] = c;
  72.                         str[i] = 0;
  73.                         scanf_s("%c", &c);
  74.                         if (i >= 20)printf("wrong,out of the limit!");
  75.                         if (c == ' ')
  76.                         {
  77.                                 d = atof(str);
  78.                                 Push(&s, d);
  79.                         }
  80.                 }
  81.                 if (')' == c)
  82.                 {
  83.                         char e;
  84.                         do
  85.                         {
  86.                                 Pop(&r, &e);
  87.                                 double a, b;
  88.                                 switch (e)
  89.                                 {
  90.                                 case '+':
  91.                                         Pop(&s,&b);
  92.                                         Pop(&s,&a);
  93.                                         Push(&s, a + b);
  94.                                         break;
  95.                                 case '-':
  96.                                         Pop(&s, &b);
  97.                                         Pop(&s, &a);
  98.                                         Push(&s, a - b);
  99.                                         break;
  100.                                 case '*':
  101.                                         Pop(&s, &b);
  102.                                         Pop(&s, &a);
  103.                                         Push(&s, a * b);
  104.                                         break;
  105.                                 case '/':
  106.                                         Pop(&s, &b);
  107.                                         Pop(&s, &a);
  108.                                         Push(&s, a / b);
  109.                                         break;
  110.                                 }
  111.                         } while (r.stack_size&&'(' != e);
  112.                 }
  113.                 else if (c == '+' || c == '-')
  114.                 {
  115.                         if (r.stack_size != 0)
  116.                         {
  117.                                 char e;
  118.                                 do
  119.                                 {
  120.                                         Pop(&r, &e);
  121.                                         if ('(' == e)
  122.                                         {
  123.                                                 Push(&r, e);
  124.                                                 break;
  125.                                         }
  126.                                         double a, b;
  127.                                         switch (e)
  128.                                         {
  129.                                         case '+':
  130.                                                 Pop(&s, &b);
  131.                                                 Pop(&s, &a);
  132.                                                 Push(&s, a + b);
  133.                                                 break;
  134.                                         case '-':
  135.                                                 Pop(&s, &b);
  136.                                                 Pop(&s, &a);
  137.                                                 Push(&s, a - b);
  138.                                                 break;
  139.                                         case '*':
  140.                                                 Pop(&s, &b);
  141.                                                 Pop(&s, &a);
  142.                                                 Push(&s, a * b);
  143.                                                 break;
  144.                                         case '/':
  145.                                                 Pop(&s, &b);
  146.                                                 Pop(&s, &a);
  147.                                                 Push(&s, a / b);
  148.                                                 break;
  149.                                         }
  150.                                 } while (r.stack_size != 0 && e != '(');
  151.                                 Push(&r, c);
  152.                         }
  153.                         else if (r.stack_size == 0)
  154.                         {
  155.                                 Push(&r, c);
  156.                         }
  157.                 }
  158.                 else if ('*' == c || '/' == c||'('==c)
  159.                 {
  160.                         Push(&r, c);
  161.                 }
  162.                 scanf_s("%c", &c);
  163.         }
  164.         while (r.stack_size != 0)
  165.         {
  166.                 char e;
  167.                 double a, b;
  168.                 Pop(&r, &e);
  169.                 switch (e)
  170.                 {
  171.                 case '+':
  172.                         Pop(&s, &b);
  173.                         Pop(&s, &a);
  174.                         Push(&s, a + b);
  175.                         break;
  176.                 case '-':
  177.                         Pop(&s, &b);
  178.                         Pop(&s, &a);
  179.                         Push(&s, a - b);
  180.                         break;
  181.                 case '*':
  182.                         Pop(&s, &b);
  183.                         Pop(&s, &a);
  184.                         Push(&s, a * b);
  185.                         break;
  186.                 case '/':
  187.                         Pop(&s, &b);
  188.                         Pop(&s, &a);
  189.                         Push(&s, a / b);
  190.                         break;
  191.                 }
  192.         }
  193.         Pop(&s,&d);
  194.         printf("answer is %.2f\n", d);
  195.         system("PAUSE");
  196. }
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 22:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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