呆呆向前沖的blog

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            78 隨筆 :: 43 文章 :: 5 評論 :: 74 Trackbacks
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          Java技術

          分析設計

          日常生活

          網絡編程

          配置管理

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          mmd 感覺腦子不夠用了。還是用笨方法:一步一步寫注釋。

          #include <stdio.h>
          #include <stdlib.h> /* for atof() */
          #include <ctype.h>

          #define MAXOP 100       /* max size of operand and operator */
          #define NUMBER '0'      /* signal that a number was found  */
          #define MAXVAL 100      /* maxmium depth of value stack */
          #define BUFSIZE 100

          int getop(char []);
          void push(double);
          double pop(void);
          int getch(void);
          void ungetch(int);

          int sp = 0;             /* next free stack position */
          double val[MAXVAL];     /* value stack  */
          char buf[BUFSIZE];      /* buffer for ungetch */
          int bufp = 0;           /* next free position in buf */

          /* reverse Polish Calculator */

          main()
          {
                  int type;
                  double op2;
                  char s[MAXOP];

                  while ((type = getop(s)) != EOF) {
                          switch (type) {
                                  case NUMBER:
                                          push(atof(s));
                                          break;
                                  case '+':
                                          push(pop() + pop());
                                          break;
                                  case '*':
                                          push(pop() * pop());
                                          break;
                                  case '-':
                                          op2 = pop();
                                          push(pop() - op2);
                                          break;
                                  case '/':
                                          op2 = pop();
                                          if (op2 != 0.0)
                                                  push(pop() / op2);
                                          else
                                                  printf("error: zero divisor\n");
                                          break;
                                  case '\n':
                                          printf("\t%.8g\n",pop());
                                          break;
                                  default:
                                          printf("error: unknown command %s\n",s);
                                          break;
                          }
                  }
                  return 0;
          }
          /* push: push f onto value stack  */
          void push(double f)
          {
                  if (sp < MAXVAL)
                          val[sp++] = f;
                  else
                          printf("error: stack full,can't push %g\n",f);
          }
          /* pop: pop and return top value from stack */
          double pop(void)
          {
                  if (sp > 0)
                          return val[--sp];
                  else {
                          printf("error: stack empty\n");
                          return 0.0;
                  }
          }
          /* getop: get next character or numeric oprand */
          int getop(char s[])
          {  
            //開始試圖讀取一個操作數或一個操作符
                  int i,c;
            //忽略空格:直到讀到非空字符
                  while ((s[0] = c = getch()) == ' ' || c == '\t')
                          ;
            //末尾加字符串結束標識
                  s[1] = '\0';
                  //if (!(s[0] == '-' && bufp == 1))
                  //        if (!isdigit(c) && c != '.')
                  //                return c;
            //如果讀到的不是數字并且不是小數點,表示讀到了一個操作符
                  if (!isdigit(c) && c != '.')
                          return c;       /* not a number */
                  i = 0;
            //如果讀到了數字,繼續讀取直到讀到非數字字符
                  if (isdigit(c)) /* collect integer part */
                          while (isdigit(s[++i] = c = getch()))
                                  ;
            //如果上面讀取到的非數字字符是小數點,繼續讀取直到讀取到非數字字符
                  if (c == '.')   /* collect fraction part */
                          while (isdigit(s[++i] = c = getch()))
                                  ;
            //在s結尾前一位加結束標識
                  s[i] = '\0';
            //如果未讀到末尾,把最后讀到的那個字符放到輸入緩沖字符數組buf中
                  if (c != EOF)
                          ungetch(c);
                  return NUMBER;
          }

          int getch(void)         /* get a (possibly pushed-back) character */
          {
                  return (bufp > 0) ? buf[--bufp] : getchar();
          }

          void ungetch(int c)     /* push character back on input */
          {
                  if (bufp >= BUFSIZE)
                          printf("ungetch: too many characters\n");
                  else
                          buf[bufp++] = c;
          }

          posted on 2005-01-25 23:19 呆呆向前沖的blog 閱讀(229) 評論(0)  編輯  收藏 所屬分類: 愛好:網絡編程

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 彰化县| 石楼县| 河曲县| 威宁| 昭通市| 井研县| 巴青县| 大洼县| 阿坝县| 拜城县| 安图县| 万宁市| 广灵县| 绥阳县| 宝兴县| 阜康市| 班玛县| 伊宁县| 灵台县| 尉犁县| 武鸣县| 堆龙德庆县| 丽江市| 柳江县| 云梦县| 富裕县| 留坝县| 沙洋县| 本溪市| 东方市| 汤原县| 左贡县| 肇源县| 德江县| 安义县| 康定县| 岳普湖县| 聊城市| 仪陇县| 安塞县| 车致|