K和R反向波兰表示法

时间:2015-07-25 19:23:31

标签: c rpn

无法弄清楚函数的调用方式。

输入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
          }
      }
推送和弹出功能的定义很容易,所以我不写它

#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]='\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;
}

1 个答案:

答案 0 :(得分:3)

  

4 - &gt;最后将执行ungetch(),在缓冲区中保存1

不,对ungetch的来电通过c,此时此行包含空格' '。因此getop返回NUMBERs"1",未处理的输入为" " buf(或更确切地说buf = { ' ', ... }bufp = 1中的"2 3 + +\n")和stdin

ungetch将字符添加到buf。如果字符getch不为空,则buf会移除并返回字符;如果buf为空,则会直接从stdin(通过getchar)读取。

这两个函数的目的是能够“读取”未读出的字符,即能够在读完一个字符之后确定你实际上并不想处理它,所以你把它放回去(要返回)下次你读输入时)。这允许您在输入中“向前看”。

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

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