K和R反向波兰表示法

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

输入1 2 3 + + [Enter] //注意输入之间有空格

输出6 //这是正确的

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

2 – >在getop()函数中,它将调用getch()函数,该函数又调用getchar(),因此在此步骤中它将读取1作为输入并返回它。

3 – >现在它检查c是否为数字,这是真的所以它将再次调用getch()读取空间,返回其值,现在它检查它是否为数字,否则被评估为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 } } 

推送和弹出function的定义很简单,所以我不是在写它

 #include int getch(void); void ungetch(int); int getop(char s[]) { int i,c; while((s[0]=c=getch())==' '||c=='\t'); s[1]='\0'; 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]='\0'; 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 – >最后将执行ungetch(),在缓冲区中保存1

不,调用ungetch传递c ,此时包含一个空格' ' 。 所以getop返回NUMBERs"1" ,未处理的输入在buf" " (或者更确切地说是buf = { ' ', ... }bufp = 1 )和stdin "2 3 + +\n"


ungetchbuf添加字符。 getch删除并返回buf字符,如果它不是空的; 如果buf为空,则直接从stdin读取(通过getchar )。

这两个函数的目的是能够“读取”字符,即能够决定在读完一个字符之后你还没有真正想要处理它,所以你把它放回去(下次再返回)你读输入)。 这允许您在输入中“向前看”。

例如,当读取像"42+..."这样的输入时,首先需要提取数字42 。 要做到这一点,首先要阅读字符'4' 。 但你不能就此止步,因为在第一个数字之后,可能会有更多数字跟随。 所以你读下一个字符'2' ,这很好,因为它也是一个数字。 但是你点击+ ,这不是数字而不是数字的一部分。 所以此时你停止处理输入,因为你知道完整的数字是42 ,但是你需要关于你刚读过的+ 。 你需要保留它,以便下一个输入操作可以返回它(否则我们只是默默地丢弃它,这对用户来说会非常混乱)。 所以你调用ungetch('+')并继续处理42 ,知道下一个getch()将拿起你刚刚放回的+


我不能告诉你实际的计算是如何完成的,因为你没有向我们展示那些代码,但据你说“这部分代码很简单”。