C语言利用栈实现Polish计算器

来源:互联网 发布:java开发框架是什么 编辑:程序博客网 时间:2024/05/17 19:16
 
/************************************************************************//* 利用栈实现反向Polish计算器:比如,输入1 2 +,其实是要计算1 + 2;/* 比如输入1 2 + 4 5 - *,其实是要计算(1 + 2) * (4 - 5)                 /************************************************************************/#include <stdio.h>#include <stdlib.h> /*for atof()*/#include <ctype.h>#define MAXOP 100 /*max size of operator or operand*/#define NUMBER '0' /*signal that a number was found*/#define MAXVAL 100 /*maximum depth of val stack*/int getop(char []);void push(double);double pop(void);/*Reverse Polish calculator*/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 '*':push(pop() * pop());break;case '-':op2 = pop();push(pop() - op2);break;case '/':op2 = pop();if (op2 != 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;}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);}}double pop(){if (sp > 0) {return val[--sp];}else{printf("error : stack empty\n");return 0.0;}}int getch(void);void ungetch(int);/*getop : get next operator or numeric operand*/int getop(char s[]){int i, c;while ((s[0] = c = getch()) == ' ' || c == '\t') {// do nothing;}s[1] = '\0';if ( !isdigit(c) && c != '.') {return c;// not a number}i = 0;if (isdigit(c)) { // collect integer partwhile (isdigit( s[++i] = c = getch()) ){//}}if (c == '.') { // collect fraction partwhile (isdigit( s[++i] = c = getch()) ){//}}s[i] = '\0';if (c != EOF) {ungetch(c);}return NUMBER;}char buf[BUFSIZ];// buffer for ungetchint bufp = 0; // next free position in bufint getch(void){return (bufp > 0) ? buf[--bufp] : getchar();}void ungetch(int c){// push character back on input if (bufp >= BUFSIZ) {printf("ungetch : too many characters\n");}else{buf[bufp ++] = c;}}

原创粉丝点击