K 和 R 逆波兰表示法

K and R Reverse Polish Notation

无法弄清楚函数是如何被调用的。

Input 1 2 3 + + [Enter] //注意input

之间有一个space

输出 6 //正确的

1 -> 当程序编译 while 语句调用函数 getop(s) 时。

2 -> 在 getop() 函数中它将调用 getch() 函数,该函数又调用 getchar() 因此在这一步它将读取 1 作为输入并 return 它。

3 -> 现在它检查 c 是否是数字,这是真的所以它会再次调用 getch() 读取 space,return 它的值,现在它检查它是否是判断为false的数字与否,则移至下一条语句。

4 -> 最后 ungetch() 将被执行,在其缓冲区中保存 1

在这一步我无法弄清楚输入是如何被读取的以及 getch 和 ungetch 的用途是什么

#define MAXOP 100
#define NUMBER '0'

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

 main()
 {
      int type;
      double op2;
      char s[MAXOP];
      while((type=getop(s))
      {
          switch(type)
          {
            //Here all operation are performed as push pop addition etc.
            //This part of code is simple
          }
      }

push 和 pop 函数的定义很简单,我就不写了

#include<ctype.h>
int getch(void);
void ungetch(int);

int getop(char s[]) {
     int i,c;
     while((s[0]=c=getch())==' '||c=='\t');
     s[1]='[=11=]';
     if(!isdigit(c)&&c!='.')
          return c;
     i=0;
     if(isdigit(c))
         while(isdigit(s[++i]=c=getch()));
     if(c=='.')
         while(isdigit(s[++i]=c=getch()));

     s[i]='[=11=]';
     if(c!=EOF)
         ungetch(c);
     return NUMBER;
}

#define BUFSIZE 100

char buf[BUFSIZE];
int bufp=0;

int getch(void) {
    return (bufp>0)?buf[--bufp]:getchar();
}

void ungetch(int c) {
    if(bufp>=BUFSIZE)
        printf("ungetch:too many character\n");
    else
        buf[bufp++]=c;
}

4 -> at last ungetch() will be executed which save 1 in its buffer

不,对ungetch的调用传递c,此时包含一个space,' '。所以 getop returns NUMBER, s"1", 而未处理的输入是 " " in buf (或者更确切地说 buf = { ' ', ... }bufp = 1) 和 "2 3 + +\n"stdin.


ungetch 将字符添加到 bufgetchbuf 中删除 returns 个字符(如果它不为空);如果 buf 为空,则直接从 stdin 读取(通过 getchar)。

这两个函数的目的是能够"unread"个字符,即能够决定在读取一个字符后你实际上还不想处理它,所以你把它放回去(下次阅读输入时 returned)。这允许您在输入中 "peek ahead"。

例如,当读取像 "42+..." 这样的输入时,您首先需要提取数字 42。为此,您首先读取字符 '4'。但是您不能就此打住,因为在第一个数字之后,后面可能还有更多数字。所以你读了下一个字符,'2',这很好,因为它也是一个数字。但随后您点击了 +,它不是数字,也不是数字的一部分。所以在这一点上你停止处理输入,因为你知道完整的数字是 42,但你需要一些关于你刚刚阅读的 + 的东西。您需要保留它以便下一个输入操作可以 return 它(否则我们会默默地删除它,这会让用户感到非常困惑)。所以你调用ungetch('+')并继续处理42,知道下一个getch()会拾取你刚刚放回去的+


我无法告诉您实际计算是如何完成的,因为您没有向我们展示该代码,但根据您的说法 "this part of code is simple"。