C语言利用栈实现Polish计算器

 
/************************************************************************/
/* 利用栈实现反向Polish计算器:比如,输入1 2 +,其实是要计算1 + 2;
/* 比如输入1 2 + 4 5 - *,其实是要计算(1 + 2) * (4 - 5)                 
/************************************************************************/


#include <stdio.h>
#include <stdlib.h> /*for atof()*/
#include <ctype.h>


#define MAXOP 100 /*max size of operator or operand*/
#define NUMBER '0' /*signal that a number was found*/
#define MAXVAL 100 /*maximum depth of val stack*/

int getop(char []);
void push(double);
double pop(void);

/*Reverse Polish calculator*/
main(){
	int type;
	double op2;
	char s[MAXOP];

	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 != 0) {
				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);
			break;
		}
	}
	return 0;
}

int sp = 0; /*next free stack position*/
double val[MAXVAL]; /*value stack*/

/*push : push f onto value stack*/
void push(double f){
	if (sp < MAXVAL) {
		val[sp++] = f;
	}
	else{
		printf("error : stack 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 getch(void);
void ungetch(int);

/*getop : get next operator or numeric operand*/
int getop(char s[]){
	int i, c;

	while ((s[0] = c = getch()) == ' ' || c == '\t') {
		// do nothing;
	}
	s[1] = '\0';
	if ( !isdigit(c) && c != '.') {
		return c;// not a number
	}

	i = 0;
	if (isdigit(c)) { // collect integer part
		while (isdigit( s[++i] = c = getch()) ){
			//
		}
	}

	if (c == '.') { // collect fraction part
		while (isdigit( s[++i] = c = getch()) ){
			//
		}
	}
	s[i] = '\0';
	if (c != EOF) {
		ungetch(c);
	}
	return NUMBER;
}

char buf[BUFSIZ];// buffer for ungetch
int bufp = 0; // next free position in buf

int getch(void){

	return (bufp > 0) ? buf[--bufp] : getchar();

}

void ungetch(int c){// push character back on input 

	if (bufp >= BUFSIZ) {
		printf("ungetch : too many characters\n");
	}
	else{
		buf[bufp ++] = c;
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值