来自K & R C第四章的逆波兰计算器
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#define MAXOP 100
#define NUMBER '0'
#define MAXVAL 100
#define BUFSIZE 100
char buf[BUFSIZE];
int bufp = 0;
int sp = 0;
double val[MAXVAL];
int getop(char s[]);
int getch();
void ungetch(int c);
void push(double f);
double pop ();
int main(){
int type = 0;
double op2 = 0;
char s[MAXOP];
while( EOF != (type = getop(s)) ){
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( 0.0 != op2 ){
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);
}
}
}
return 0;
}
void push(double f){
if( sp < MAXVAL ){
val[sp++] = f;
}else{
printf("error:statck 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 getop(char s[]){
int i = 0;
int c = 0;
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 = getchar())) ;
}
s[i] = '\0';
if( c != EOF ){
ungetch(c);
}
return NUMBER;
}
int getch(){
return ( bufp > 0 ) ? buf[--bufp] : getchar();
}
void ungetch(int c){
if( bufp >= BUFSIZE ){
printf("ungetch: too many characters\n");
}else{
buf[bufp++] = c;
}
}
运行结果:
1 2 -
-1
1 2 - 4 5 + *
-9