堆栈实现,计算后缀表达式

/*compute sufix expression*/
#include <stdio.h>
#include "stack.h"
#include <string.h>
#include <assert.h>
#include <ctype.h>
#define TRUE	1
#define FASLE	0
double add( double op1, double op2 );
double sub( double op1, double op2 );
double mul( double op1, double op2 );
double div( double op1, double op2 );
static char operator_group[] = "+-*/";
static double (*op[4])( double , double ) = {
	add, sub, mul, div
};
int is_operator( char ch );
static char whitespace[] = " \t\f\v\n\r";
#define MAX_LEN		100
int main()
{
	double		cmp_temp1, cmp_temp2, cmp_result;
	double		ulti_result;
	char		*token;
	char		buffer[MAX_LEN];
	printf("Please input the expression\n");
	while( fgets( buffer, MAX_LEN, stdin ) != NULL ){		
	
		for( token = strtok( buffer, whitespace);
			token != NULL;
			token = strtok( NULL, whitespace ) ){
				if( is_operator( *token ) && *(token + 1) == '\0' ){
					cmp_temp2 = top();
					pop();
					cmp_temp1 = top();
					pop();
					switch( *token ){
					case '+':
						cmp_result = op[0]( cmp_temp1, cmp_temp2 );
						break;
					case '-':
						cmp_result = op[1]( cmp_temp1, cmp_temp2 );
						break;
					case '*':
						cmp_result = op[2]( cmp_temp1, cmp_temp2 );
						break;
					case '/':
						cmp_result = op[3]( cmp_temp1, cmp_temp2 );
						break;
					}
					push( cmp_result );
				}
				else {
					float		f_value;
					sscanf(token ,"%f", &f_value );
					push( f_value );
				}	
			}


	}
	/*打印结果*/
	ulti_result = top();
	pop();
	//堆栈应该为空;
	assert(is_empty())
	printf("the result of the expression is %f", ulti_result );
	return 0;

}

int is_operator(  char ch  )
{
	char	*ptr = &ch;
	if( strpbrk( ptr, operator_group ) == NULL )
		return FASLE;
	return TRUE;	
}

double add( double op1, double op2 )
{
	return op1 + op2;
}

double sub( double op1, double op2 )
{
	return op1 - op2;
}

double mul( double op1, double op2 )
{
	return op1 * op2;
}

double div( double op1, double op2 )
{
	if( op2 == 0 ){
		printf( "除数不能为0" );
		return FASLE;
	}
	return op1 / op2;
}


计算后缀表达式;

可以计算浮点数,负数,没有添加其他的运算符,只有+-*/


  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值