#include
#include
#include
#define MAXOP 100
#define NUMBER '0'
int getop(char []) ;
void push(double) ;
double pop(void) ;
/*逆波兰式输入计算器程序*/
main()
{
char s[MAXOP] ;
int type ;
double op2 ;
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)
push(pop()/op2) ;
else
printf("error : zero divisor\n") ;
break ;
case '%' :
op2 = pop() ;
if(op2)
push(fmod(pop(),op2)) ;
else
printf("error:") ;
break ;
case '\n' :
printf("\t%.8g\n",pop()) ;
break ;
default :
printf("ERROR! unknown command %s \n") ;
break ;
}
}
}
/*构建栈*/
#define MAXVAL 100
#define OK 1
#define TRUE 1
#define FALSE 0
double val[MAXVAL] ;
int sp = 0 ;
void push(double f)
{
if(sp < MAXVAL)
val[sp++] = f ;
else
printf("error : stack full ,can't push %g\n",f) ;
}
double pop(void)
{
if(sp > 0)
return(val[--sp]) ;
else {
printf("error : stack empty\n") ;
return 0.0 ;
}
}
#include
int getch(void) ;
void ungetch(int) ;
int getop(char s[])
{
int i , c ;
i = 0 ;
while(( s[0] = c = getch()) == ' ' || c == '\t') ;
s[1] = '\0' ;
if(!isdigit(c) && c != '.' && c != '-')
return c ;
if(c == '-')
if(isdigit(c = getch())||c == '.')
s[++i] = c ;
else{
if(c != EOF)
ungetch(c) ;
return '-' ;
}
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("error:too many characters\n") ;
else
buf[bufp++] = c ;
}