c语言 逆波兰式输入 计算器程序

#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 ;
}

你可能感兴趣的:(c语言)