栈实现表达式计算

#include<stdio.h>
#include<stdlib.h>
#include"base.h"

char Precede(char t1,char t2)
{
	char f;
	switch(t2)
	{	
	case '+':
	case '-':
		if(t1 == '(' || t1 == '\n')
			f = '<';		//t1 < t2
		else
			f = '>';		//t1 > t2
		break;
	case '*':
	case '/':
		if(t1 == '*' || t1 == '/' || t1 == ')')
			f = '>';	//t1 > t2
		else
			f = '<';		//t1 < t2
		break;
	case '(':
		if(t1 == ')')
		{
			printf("括号不匹配\n");
			exit(OVERFLOW);
		}
		else
			f = '<';	//t1 < t2
		break;
	case ')':
		switch(t1)
		{ 
		case '(':
			f = '=';	//t1 = t2
			break;
		case '\n':printf("缺乏左括号\n");
			exit(OVERFLOW);
		default: f = '>';	//t1 > t2
		}
		break;
		
		case '\n':
			switch(t1)
			{ 
			case '\n': f = '=';		//t1 = t2
				break;
			case '(':printf("缺乏右括号\n");
				exit(OVERFLOW);
			default : f = '>';		//t1 > t2
			}
	}
	return f;
}

bool In(char c)
{
	switch(c)
	{
	case '+':
	case '-':
	case '*':
	case '/':
	case '(':
	case ')':
	case '\n':return true;
	default: return false;
	}
}

SElemType Operate(SElemType a, SElemType theta, SElemType b)
{
	switch(theta)
	{
	case'+': return a + b;
	case'-': return a - b;
	case'*': return a * b;
	}
	return a / b;
}


#include <stdio.h>
#include "base.h"
#include "function.cpp"
#include "stack.cpp"

SElemType EvaluateExpression()
{
	STACK OPTR,OPND;
	SElemType a,b,d,x;
	char c;
	Init_Stack(OPTR);
	Init_Stack(OPND);
	Push(OPTR,'\n');
	c = getchar();
	GetTop(OPTR,x);
	while(c != '\n' || x != '\n')
	{
		if(In(c))
			switch(Precede(x,c))
		{
			case '<': 
				Push(OPTR,c);
				c = getchar();
				break;
			case '=':
				Pop(OPTR,x);
				c = getchar();
				break;
			case '>':
				Pop(OPTR,x);
				Pop(OPND,b);
				Pop(OPND,a);
				Push(OPND,Operate(a,x,b));
		}
		else if(c >= '0' && c <= '9')
		{
			d = 0;
			while(c >= '0' && c <= '9')
			{
				d = d * 10 + c - '0';
				c = getchar();
			}
			Push(OPND,d);
		}
		else
		{
			printf("出现非法字符\n");
			exit(OVERFLOW);
		}
		GetTop(OPTR,x);
	}
	Pop(OPND,x);
	if(!is_empty(OPND))
	{
		printf("出现非法字符\n");
		exit(OVERFLOW);
	}
	return x;
}

void main()
{
	printf("请输入算数表达式,负数要用(0-正数)表示\n");
	printf("%d\n",EvaluateExpression() );
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值