关闭

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

标签: c语言
811人阅读 评论(0) 收藏 举报
分类:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

#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<ctype.h>

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:9131次
    • 积分:215
    • 等级:
    • 排名:千里之外
    • 原创:12篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条
    文章分类