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
将字符添加到 buf
。 getch
从 buf
中删除 returns 个字符(如果它不为空);如果 buf
为空,则直接从 stdin
读取(通过 getchar
)。
这两个函数的目的是能够"unread"个字符,即能够决定在读取一个字符后你实际上还不想处理它,所以你把它放回去(下次阅读输入时 returned)。这允许您在输入中 "peek ahead"。
例如,当读取像 "42+..."
这样的输入时,您首先需要提取数字 42
。为此,您首先读取字符 '4'
。但是您不能就此打住,因为在第一个数字之后,后面可能还有更多数字。所以你读了下一个字符,'2'
,这很好,因为它也是一个数字。但随后您点击了 +
,它不是数字,也不是数字的一部分。所以在这一点上你停止处理输入,因为你知道完整的数字是 42
,但你需要一些关于你刚刚阅读的 +
的东西。您需要保留它以便下一个输入操作可以 return 它(否则我们会默默地删除它,这会让用户感到非常困惑)。所以你调用ungetch('+')
并继续处理42
,知道下一个getch()
会拾取你刚刚放回去的+
。
我无法告诉您实际计算是如何完成的,因为您没有向我们展示该代码,但根据您的说法 "this part of code is simple"。
无法弄清楚函数是如何被调用的。
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
将字符添加到 buf
。 getch
从 buf
中删除 returns 个字符(如果它不为空);如果 buf
为空,则直接从 stdin
读取(通过 getchar
)。
这两个函数的目的是能够"unread"个字符,即能够决定在读取一个字符后你实际上还不想处理它,所以你把它放回去(下次阅读输入时 returned)。这允许您在输入中 "peek ahead"。
例如,当读取像 "42+..."
这样的输入时,您首先需要提取数字 42
。为此,您首先读取字符 '4'
。但是您不能就此打住,因为在第一个数字之后,后面可能还有更多数字。所以你读了下一个字符,'2'
,这很好,因为它也是一个数字。但随后您点击了 +
,它不是数字,也不是数字的一部分。所以在这一点上你停止处理输入,因为你知道完整的数字是 42
,但你需要一些关于你刚刚阅读的 +
的东西。您需要保留它以便下一个输入操作可以 return 它(否则我们会默默地删除它,这会让用户感到非常困惑)。所以你调用ungetch('+')
并继续处理42
,知道下一个getch()
会拾取你刚刚放回去的+
。
我无法告诉您实际计算是如何完成的,因为您没有向我们展示该代码,但根据您的说法 "this part of code is simple"。