呆呆向前沖的blog

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            78 隨筆 :: 43 文章 :: 5 評(píng)論 :: 74 Trackbacks

          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[])
          {  
            //開始試圖讀取一個(gè)操作數(shù)或一個(gè)操作符
                  int i,c;
            //忽略空格:直到讀到非空字符
                  while ((s[0] = c = getch()) == ' ' || c == '\t')
                          ;
            //末尾加字符串結(jié)束標(biāo)識(shí)
                  s[1] = '\0';
                  //if (!(s[0] == '-' && bufp == 1))
                  //        if (!isdigit(c) && c != '.')
                  //                return c;
            //如果讀到的不是數(shù)字并且不是小數(shù)點(diǎn),表示讀到了一個(gè)操作符
                  if (!isdigit(c) && c != '.')
                          return c;       /* not a number */
                  i = 0;
            //如果讀到了數(shù)字,繼續(xù)讀取直到讀到非數(shù)字字符
                  if (isdigit(c)) /* collect integer part */
                          while (isdigit(s[++i] = c = getch()))
                                  ;
            //如果上面讀取到的非數(shù)字字符是小數(shù)點(diǎn),繼續(xù)讀取直到讀取到非數(shù)字字符
                  if (c == '.')   /* collect fraction part */
                          while (isdigit(s[++i] = c = getch()))
                                  ;
            //在s結(jié)尾前一位加結(jié)束標(biāo)識(shí)
                  s[i] = '\0';
            //如果未讀到末尾,把最后讀到的那個(gè)字符放到輸入緩沖字符數(shù)組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 閱讀(227) 評(píng)論(0)  編輯  收藏 所屬分類: 愛好:網(wǎng)絡(luò)編程

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 天台县| 商南县| 凤山县| 菏泽市| 南郑县| 甘肃省| 伊通| 阿图什市| 杭锦旗| 剑河县| 安丘市| 七台河市| 乳源| 武穴市| 洪泽县| 绿春县| 邳州市| 和静县| 北票市| 昭通市| 海淀区| 临清市| 保定市| 丹阳市| 珠海市| 体育| 介休市| 温州市| 上虞市| 抚州市| 光山县| 潮州市| 井研县| 四会市| 南川市| 大余县| 静乐县| 油尖旺区| 正蓝旗| 安宁市| 荣成市|