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

原创 2013年12月02日 19:07:23
#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 ;
}

相关文章推荐

C语言实现的逆波兰式计算器

  • 2015年04月26日 11:16
  • 259KB
  • 下载

C语言利用栈实现将中缀表达式转换为后缀表达式(即逆波兰式)

输入计算表达式如:(1-3)*4+10/5 输出的逆波兰式:1  3  -  4  * 10  5  /   + 码代码时脸上洋溢着的神秘的微笑 #include #include #in...

C语言逆波兰式(数据结构)

  • 2012年12月05日 01:45
  • 155KB
  • 下载

逆波兰式生成程序

  • 2008年07月02日 11:03
  • 4KB
  • 下载

使用逆波兰式(后缀表达式)实现多功能计算器

由于这是之前的小作业了,之前贴出来没注意,后来发现格式太乱了根本看不了,所以今天再贴出来一下,这次的计算器比我之前写的要复杂很多,主要是通过逆波兰式实现的,没有界面,计算器是我之前的一个软肋啊,编了好...

逆波兰式 HDU1237 简单计算器

题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19367 题意: 给定一个计算式,计算式合法。每个运算符和数...

Java计算器实现(逆波兰式)

Java计算器实现(逆波兰式)

利用栈实现计算器,先转换为逆波兰式之后运算

http://blog.csdn.net/liuzhustu/ #include #include #include #include #include #include using names...

HDOJ 题目1237简单计算器(栈,逆波兰式)

简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c语言 逆波兰式输入 计算器程序
举报原因:
原因补充:

(最多只允许输入30个字)