文章标题
2015-08-21 00:37
337 查看
4.3节 Polish calculator.
#include <stdio.h> #include <stdlib.h> /* for atof() */ #define MAXOP 100 /* max size of operand or operator */ #define NUMBER '0' /* signal that a number was found */ int getop(char s[]); void push(double f); double pop(void); /* reverse Polish calculator */ int main() { int type; double op2; char s[MAXOP]; while((type = getop(s)) != EOF){ switch(type){ case NUMBER: push(atof(s)); break; case '+': push(pop()+pop()); break; case '-': op2 = pop(); push(pop()-op2); break; case '*': push(pop()*pop()); break; case '/': op2 = pop(); if(op2 != 0.0) push(pop()/op2); else printf("error: zero divisor\n"); break; case '\n': printf("\t%.8g\n", pop()); break; default: printf("error: unknown command %s\n", s); break; } } return 0; } #define MAXVAL 100 /* maximum depth of val stack */ int sp = 0; /* next free stack position */ double val[MAXVAL]; /* value stack */ /* push: push f onto value stack */ void push(double f) { if(sp < MAXVAL) val[sp++] = f; else printf("error: stack full, can't push %g\n", f); } /* pop: pop and return top value from stack */ double pop(void) { if(sp > 0) return val[--sp]; else{ printf("error: stack empty\n"); return 0.0; } } #include <ctype.h> int getch(void); void ungetch(int c); /* get next character or numeric operand */ 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; while(isdigit(c)){ s[i++] = c; c = getch(); } if(c == '.'){ s[i] = c; while(isdigit(s[++i] = c = getch())) ; } s[i] = '\0'; if(c != EOF) ungetch(c); return NUMBER; } #define BUFSIZE 100 char buf[BUFSIZE]; /* buffer for ungetch */ int bufp = 0; /* next free position in 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#中的Action<>和Func<>
- Java设计模式之适配器模式
- Python小结点&递归例子
- 各大牛逼讲师的经典Jquery精品视频教程,大放送啦!!!(包括手机移动端JqueryWeb开发)!!!
- Java设计模式之单例模式
- HDU 4345 Permutation dp
- 读书笔记之计算机系统(4)
- MySQL CMake参数说明手册 【转载】
- Java设计模式之原型模式
- makefile中“=”和“:=”的区别
- Android利用布局实现伪自定义商品数量加减控件
- 工作流图形设计器参考资料
- 黑马程序员_java基础学习IO流学习笔记
- Git分支操作
- Linux 命令 - 关机重启命令 shutdown
- 快速排序java
- JVM内存回收机制