小白写逆波兰计算器

/*逆波兰计算器:淮南师范学院 电子工程学院 夏健钧 2017/3/24*/
/*逆波兰计数法:参考维基百科*/
#include
#include  /*为了使用atof()函数*/
#include
#define MAXOP 100   /*操作数或运算符的最大长度*/
#define NUMBER '0'  /*标识找到一个数*/

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

/* 逆波兰计算器 */
int main(int argc, const char *argv[])
{
 int type;
 double op2;
 char s[MAXOP];


 while ((type = getop(s)) != EOF)
 {
  switch (type)
  {
   case NUMBER:
     push(atof(s)); /*atof(s):将字符串(s)转换为双精度的浮点数据*/
     break;
   case '+':
       push(pop() + pop()); /*先弹出并返回栈顶的值,将两值相加后,压到栈底*/
       break; 
   case '*':
       push(pop() * pop()); /*先弹出并返回栈顶的值,将两值相乘后,压到栈底*/
       break; 
   case '-':            /* 因 * / 不满足交换律 需要考虑弹出的次序*/
       op2 = pop ();  /*将先输入的值赋值给op2,后输入的值减去op2,将结果压入栈底*/
       push(pop() - op2);
       break;

   case '/':
       op2 = pop ();  /* 将先输入的值赋值给op2,后输入的值除以op2,将结果压入栈底 */
       if (op2 != 0.0) /* 0 做分子无意义 */
        push(pop() / op2);
       else
        printf("error: zero divisor\n");
       break;
   case '\n':
       printf("\t%.8g\n", pop()); /*当按下 enter 键后 输出栈顶的值,即最终的计算结果*/
       break;
   default:
       printf("error: unknown command %s\n",s);
       break;
     } 
 
 }
 return 0;
}

#define MAXVAL 100  /* 栈VAL的最大深度 */

int sp = 0;     /* 下一个空闲栈的位置 */
double val[MAXVAL]; /* 值栈 */

/* push函数: 把f压入到值栈中 */
void push (double f)
{
 if (sp < MAXVAL)
  val [sp++] = f;
 else
  printf("error: stack full,can't push %g\n",f);

}

/* pop函数: 弹出并返回栈顶的值 */
double pop (void)
{
 if (sp > 0)
  return val [--sp];
 else
 {
  printf("error: stack empty\n");
  return 0.0;
 
 }

}

int getch(void);
void ungetch(int);
/* getop函数:获取下一个运算符或数值操作符 */
int getop (char s[])
{
 int i, c;
 while ((s[0] = c = getch()) ==  ' ' || c == '\t') /* 跳过空格与制表符 */
  ;
  s[1] = '\0';
 if (!isdigit(c) && c != '.') /*isdigit(c):测试字符是否为数字:是,返回非0,不是返回0*/
  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]; /* 用于ungetch函数的缓冲区*/
int bufp = 0 ;  /* buf中下一个空闲位置 */
int getch (void)   /*取一个字符(可能是压回的字符) */
{
 return (bufp > 0) ? buf [--bufp] : getchar();
 
}

void ungetch( int c )  /* 把字符压回到输入中 */
{
 if (bufp >= BUFSIZE )
  printf("ungetch: too many characters\n");
 else
  buf[bufp++] = c;

}

 

 

 

你可能感兴趣的:(C语言学习阶段)