鱼C论坛

 找回密码
 立即注册
查看: 3192|回复: 1

第27讲逆波兰计算器中程序问题

[复制链接]
发表于 2016-10-13 21:49:38 | 显示全部楼层 |阅读模式

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

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

x
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <stdlib.h>

  4. #define STACK_INIT_SIZE 20
  5. #define STACKINCREMENT  10
  6. #define MAXBUFFER       10

  7. typedef double ElemType;
  8. typedef struct
  9. {
  10.     ElemType *base;
  11.     ElemType *top;
  12.     int stackSize;
  13. }sqStack;

  14. InitStack(sqStack *s)
  15. {
  16.     s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
  17.     if( !s->base )
  18.         exit(0);

  19.     s->top = s->base;
  20.     s->stackSize = STACK_INIT_SIZE;
  21. }

  22. Push(sqStack *s, ElemType e)
  23. {
  24.     // 栈满,追加空间,鱼油必须懂!
  25.     if( s->top - s->base >= s->stackSize )
  26.     {
  27.         s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
  28.         if( !s->base )
  29.             exit(0);

  30.         s->top = s->base + s->stackSize;
  31.         s->stackSize = s->stackSize + STACKINCREMENT;
  32.     }

  33.     *(s->top) = e;      // 存放数据
  34.     s->top++;
  35. }

  36. Pop(sqStack *s, ElemType *e)
  37. {
  38.     if( s->top == s->base )
  39.         return;

  40.     *e = *--(s->top);   // 将栈顶元素弹出并修改栈顶指针
  41. }

  42. int StackLen(sqStack s)
  43. {
  44.     return (s.top - s.base);
  45. }

  46. int main()
  47. {
  48.     sqStack s;
  49.     char c;
  50.     double d, e;
  51.     char str[MAXBUFFER];
  52.     int i = 0;

  53.     InitStack( &s );

  54.     printf("请按逆波兰表达式输入待计算数据,数据与运算符之间用空格隔开,以#作为结束标志: \n");
  55.     scanf("%c", &c);

  56.     while( c != '#' )
  57.     {
  58.         while( isdigit(c) || c=='.' )  // 用于过滤数字
  59.         {
  60.             str[i++] = c;
  61.             str[i] = '\0';
  62.             if( i >= 10 )
  63.             {
  64.                 printf("出错:输入的单个数据过大!\n");
  65.                 return -1;
  66.             }
  67.             scanf("%c", &c);
  68.             if( c == ' ' )
  69.             {
  70.                 d = atof(str);
  71.                 Push(&s, d);
  72.                 i = 0;
  73.                 break;
  74.             }
  75.         }

  76.         switch( c )
  77.         {
  78.             case '+':
  79.                 Pop(&s, &e);
  80.                 Pop(&s, &d);
  81.                 Push(&s, d+e);
  82.                 break;
  83.             case '-':
  84.                 Pop(&s, &e);
  85.                 Pop(&s, &d);
  86.                 Push(&s, d-e);
  87.                 break;
  88.             case '*':
  89.                 Pop(&s, &e);
  90.                 Pop(&s, &d);
  91.                 Push(&s, d*e);
  92.                 break;
  93.             case '/':
  94.                 Pop(&s, &e);
  95.                 Pop(&s, &d);
  96.                 if( e != 0 )
  97.                 {
  98.                     Push(&s, d/e);
  99.                 }
  100.                 else
  101.                 {
  102.                     printf("\n出错:除数为零!\n");
  103.                     return -1;
  104.                 }
  105.                 break;
  106.         }

  107.         scanf("%c", &c);
  108.     }

  109.     Pop(&s, &d);
  110.     printf("\n最终的计算结果为:%f\n", d);

  111.     return 0;
  112. }
复制代码

main()函数中提取数字和小数点部分为什么还要使用'\0':str='\0';
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-10-13 21:50:32 | 显示全部楼层

标注具体位置

  1. while( isdigit(c) || c=='.' )  // 用于过滤数字
  2.         {
  3.             str[i++] = c;
  4.             str[i] = '\0';
  5.             if( i >= 10 )
  6.             {
  7.                 printf("出错:输入的单个数据过大!\n");
  8.                 return -1;
  9.             }
  10.             scanf("%c", &c);
  11.             if( c == ' ' )
  12.             {
  13.                 d = atof(str);
  14.                 Push(&s, d);
  15.                 i = 0;
  16.                 break;
  17.             }
  18.         }
复制代码

这部分中间的str='\0'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 03:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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