鱼C论坛

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

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

[复制链接]
发表于 2016-10-13 21:54: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. }
复制代码

在筛选数字和小数点的代码中为什么要用str='\0'?
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-13 23:15:41 | 显示全部楼层
本帖最后由 1012662902 于 2016-10-13 23:18 编辑

标识数组末尾。
当然也可以在第2个while前面初始化整个str:
memset(str,'\0',strlen(str));
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 14:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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