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
返回NUMBER
, s
为"1"
,未处理的输入在buf
为" "
(或者更确切地说是buf = { ' ', ... }
, bufp = 1
)和stdin
"2 3 + +\n"
。
ungetch
为buf
添加字符。 getch
删除并返回buf
字符,如果它不是空的; 如果buf
为空,则直接从stdin
读取(通过getchar
)。
这两个函数的目的是能够“读取”字符,即能够决定在读完一个字符之后你还没有真正想要处理它,所以你把它放回去(下次再返回)你读输入)。 这允许您在输入中“向前看”。
例如,当读取像"42+..."
这样的输入时,首先需要提取数字42
。 要做到这一点,首先要阅读字符'4'
。 但你不能就此止步,因为在第一个数字之后,可能会有更多数字跟随。 所以你读下一个字符'2'
,这很好,因为它也是一个数字。 但是你点击+
,这不是数字而不是数字的一部分。 所以此时你停止处理输入,因为你知道完整的数字是42
,但是你需要关于你刚读过的+
。 你需要保留它,以便下一个输入操作可以返回它(否则我们只是默默地丢弃它,这对用户来说会非常混乱)。 所以你调用ungetch('+')
并继续处理42
,知道下一个getch()
将拿起你刚刚放回的+
。
我不能告诉你实际的计算是如何完成的,因为你没有向我们展示那些代码,但据你说“这部分代码很简单”。