用栈实现表达式求值

支持四则运算、小括号、中括号、乘方运算、小数运算 

//EvaluateExpression
//表达式求值

/*
	昔	我	往	矣,	杨	柳	依	依
	今	我	来	思,	雨	雪	霏	霏
*/

#include <iostream>
#include<stdlib.h>
#include<math.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define ARGC_CNT 2		//参数个数
using namespace std;
typedef int Status;
//-----栈的顺序存储表示-----
#define STACK_INIT_SIZE 5			//栈的初始大小
#define STACKINCREMENT 2			//栈的扩展大小

typedef double OperandType;
typedef struct {
	OperandType* base;
	OperandType* top;
	int stacksize;
}SqStack_OPND;						//操作数栈

typedef char OperatorType;
typedef struct {
	OperatorType* base;
	OperatorType* top;
	int stacksize;
}SqStack_OPTR;						//操作符栈

//-----栈操作之函数原型----- 
Status InitStack_OPND(SqStack_OPND& S);
Status DestroyStack_OPND(SqStack_OPND& S);
Status ClearStack_OPND(SqStack_OPND& S);
Status StackEmpty_OPND(SqStack_OPND S);
int StackLength_OPND(SqStack_OPND S);
OperandType GetTop_OPND(SqStack_OPND S);
Status Push_OPND(SqStack_OPND& S, OperandType e);
Status Pop_OPND(SqStack_OPND& S, OperandType& e);
Status visit_OPND(OperandType x);
Status StackTraverse_OPND(SqStack_OPND S, Status(*visit)(OperandType));
Status InitStack_OPTR(SqStack_OPTR& S);
Status DestroyStack_OPTR(SqStack_OPTR& S);
Status ClearStack_OPTR(SqStack_OPTR& S);
Status StackEmpty_OPTR(SqStack_OPTR S);
int StackLength_OPTR(SqStack_OPTR S);
OperatorType GetTop_OPTR(SqStack_OPTR S);
Status Push_OPTR(SqStack_OPTR& S, OperatorType e);
Status Pop_OPTR(SqStack_OPTR& S, OperatorType& e);
Status visit_OPTR(OperatorType x);
Status StackTraverse_OPTR(SqStack_OPTR S, Status(*visit)(OperatorType));

//------表达式求值操作之函数原型-----
int Precede(OperatorType optr1, OperatorType optr2);
Status InOP(OperatorType e);
OperandType Operate(OperandType a, OperatorType theta, OperandType b);
OperandType Pow(OperandType a, OperandType b);
OperandType EvaluateExpression(char* expression);
Status InNum(OperatorType e);
Status InOP2(OperatorType e);

int main(int argc, char* argv[])
{
	//根据程序需要判断参数数量是否正确
	if (argc != ARGC_CNT)
	{
		printf("parameter input error.\n");
		printf("ERROR_01");
		getchar();				 //等待用户输入
		return -1;
	}
	char* p = argv[1];
	while (*p) p++;
	*p = '#';					//将表达式末尾改成终止符
	cout << EvaluateExpression(argv[1]);
	return 0;
}

//-----表达式求值之算法描述-----
int Precede(OperatorType theta1, OperatorType theta2) {
	//判断算符theta1和theta2的优先级
	//若theta1>theta2返回1,若小于返回-1,若等于返回0,若出错返回-2
	int i, j;
	//优先级矩阵
	int Relationship[10][10] = { {1,1,-1,-1,-1,1,1,-1,-1,1},
		{1,1,-1,-1,-1,1,1,-1,-1,1},
		{1,1,1,1,-1,1,1,-1,-1,1},
		{1,1,1,1,-1,1,1,-1,-1,1},
		{-1,-1,-1,-1,-1,0,-2,-1,-1,-2},
		{1,1,1,1,-2,1,1,1,-2,1},
		{-1,-1,-1,-1,-1,-2,0,-1,-1,-2},
		{1,1,1,1,-1,1,1,1, -1,1},
		{-1,-1,-1,-1,-1,-2,-2,-1,-1,0},
		{1,1,1,1,-2,1,1,1,-2,1} };
	enum { plus, subtraction, multiply, divide, leftbracket, rightbracket, pound, involution, leftBracket, rightBracket };
	switch (theta1)
	{
	case'+': i = plus; break;
	case'-': i = subtraction; break;
	case'*': i = multiply; break;
	case'/': i = divide; break;
	case'(': i = leftbracket; break;
	case')': i = rightbracket; break;
	case'#': i = pound; break;
	case'^': i = involution; break;
	case'[': i = leftBracket; break;
	case']': i = rightBracket; break;
	default:
		cout << "ERROR_02";
		return -2;
	}
	switch (theta2)
	{
	case '+': j = plus; break;
	case '-': j = subtraction; break;
	case '*': j = multiply; break;
	case '/': j = divide; break;
	case '(': j = leftbracket; break;
	case ')': j = rightbracket; break;
	case '#': j = pound; break;
	case '^': j = involution; break;
	case '[': j = leftBracket; break;
	case ']': j = rightBracket; break;
	default:
		cout << "ERROR_02";
		return -2;
	}
	return Relationship[i][j];
}//Precede

OperandType EvaluateExpression(char* expression) {
	//计算以字符串表示的表达式expression的值
	SqStack_OPND OPND;
	SqStack_OPTR OPTR;
	InitStack_OPND(OPND);
	InitStack_OPTR(OPTR);
	char c;
	OperatorType x, theta;
	OperandType a, b, num, num_dec;
	int dot;
	Push_OPTR(OPTR, '#');
	char* p = expression;
	c = *p;
	while (c != '#' || GetTop_OPTR(OPTR) != '#') {
		if (!InOP(c)) {
			if (!InNum(c)) {
				cout << "ERROR_02";
				exit(ERROR);
			}
			num = 0.0;
			dot = 0;
			int d = 10;
			while (!InOP(c)) {
				if (c != '.')
					num = 10 * num + c - '0';
				else {
					dot = 1;
					c = *++p;
					break;
				}//else
				c = *++p;
			}//while
			if (dot == 1) {
				if (InOP(c)) {
					cout << "ERROR_02";
					exit(ERROR);
				}
				while (!InOP(c)) {
					num = num + (double)(c - '0') / d;
					d = d * 10;
					c = *++p;
				}//while
			}//if
			Push_OPND(OPND, num);
		}//if
		else {

			if (InOP2(c) && InOP2(*(p + 1))) {
				cout << "ERROR_02";
				exit(ERROR);
			}
			switch (Precede(GetTop_OPTR(OPTR), c))
			{
			case -1:
				Push_OPTR(OPTR, c);
				c = *++p;
				break;
			case 0:
				Pop_OPTR(OPTR, x);
				c = *++p;
				break;
			case 1:
				Pop_OPTR(OPTR, theta);
				Pop_OPND(OPND, b);
				Pop_OPND(OPND, a);
				Push_OPND(OPND, Operate(a, theta, b));
				break;
			default:
				cout << "ERROR_02";
				exit(ERROR);
				break;
			}//switch
		}//else
	}//while
	double result = GetTop_OPND(OPND);
	DestroyStack_OPND(OPND);
	DestroyStack_OPTR(OPTR);
	return result;
}//EvaluateExpression

OperandType Operate(OperandType a, OperatorType theta, OperandType b) {
	//计算a theta b的值
	switch (theta)
	{
	case'+':
		return a + b;
		break;
	case'-':
		return a - b;
		break;
	case'*':
		return a * b;
		break;
	case'/':
		if (b == 0) {
			cout << "ERROR_03";
			exit(ERROR);
		}
		return a / b;
		break;
	case'^':
		return pow(a, b);
		break;
	default:
		exit(ERROR);
		break;
	}
	return ERROR;
}//Operate

OperandType Pow(OperandType a, OperandType b) {
	//指数计算
	int i;
	OperandType result = 1.0;
	for (i = 0; i < b; i++) 
		result = result * a;
	return result;
}//Pow

Status InOP(OperatorType e) {
	//判断元素e是否属于运算符集合OP,若属于返回TRUE,若不属于返回FALSE
	char OP[11] = "+-/*()[]^#";
	char* p;
	for (p = OP; *p; p++)
		if (*p == e) return TRUE;
	return FALSE;
}//InOP

Status InOP2(OperatorType e) {
	//判断元素e是否属于运算符集合OP2,若属于返回TRUE,若不属于返回FALSE
	char OP2[11] = "+-/*^";
	char* p;
	for (p = OP2; *p; p++)
		if (*p == e) return TRUE;
	return FALSE;
}//InOP2

Status InNum(OperatorType e) {
	//判断元素e是否属于数字集合,若属于返回TRUE,若不属于返回FALSE
	char Num[12] = "0123456789.";
	char* p;
	for (p = Num; *p; p++)
		if (*p == e) return TRUE;
	return FALSE;
}//InNum

//-----栈操作之算法描述
Status InitStack_OPTR(SqStack_OPTR& S) {
	//构造一个空栈S 
	S.base = (OperatorType*)malloc(STACK_INIT_SIZE * sizeof(OperatorType));
	if (!S.base) exit(OVERFLOW);
	S.top = S.base;
	S.stacksize = STACK_INIT_SIZE;
	return OK;
}

Status DestroyStack_OPTR(SqStack_OPTR& S) {
	//销毁栈S,S不再存在 
	free(S.base);
	S.stacksize = 0;
	return OK;
}

Status ClearStack_OPTR(SqStack_OPTR& S) {
	//把S置为空栈 
	S.top = S.base;
	return OK;
}

Status StackEmpty_OPTR(SqStack_OPTR S) {
	//若栈S为空栈,则返回TRUE,否则返回FALSE 
	if (S.top == S.base) return TRUE;
	else return FALSE;
}

int StackLength_OPTR(SqStack_OPTR S) {
	//返回S的元素个数,即栈的长度
	int len = S.top - S.base;
	return len;
}

OperatorType GetTop_OPTR(SqStack_OPTR S) {
	//若栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR 
	OperandType e;
	if (S.base == S.top) return ERROR;
	e = *(S.top - 1);
	return e;
}

Status Push_OPTR(SqStack_OPTR& S, OperatorType e) {
	//插入元素e为新的栈顶元素 
	if (S.top - S.base >= S.stacksize) {		//判断是否栈满
		S.base = (OperatorType*)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(OperatorType));
		if (!S.base) exit(OVERFLOW);
		S.top = S.base + S.stacksize;
		S.stacksize += STACKINCREMENT;
	}
	*S.top++ = e;
	return OK;
}

Status Pop_OPTR(SqStack_OPTR& S, OperatorType& e) {
	//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR 
	if (S.top == S.base) return ERROR;
	e = *--S.top;
	return OK;
}

Status visit_OPTR(OperatorType x) {
	printf("%c\t", x);
	return OK;
}

Status StackTraverse_OPTR(SqStack_OPTR S, Status(*visit)(OperatorType)) {
	//从栈底到栈顶依次对栈中每个元素调用函数visit(),一旦visit失败,则操作失败 
	OperatorType* p;
	for (p = S.base; p < S.base + StackLength_OPTR(S); p++)
		if (!visit(*p))
			return ERROR;
	return OK;
}

//-----栈操作的算法描述----- 
Status InitStack_OPND(SqStack_OPND& S) {
	//构造一个空栈S 
	S.base = (OperandType*)malloc(STACK_INIT_SIZE * sizeof(OperandType));
	if (!S.base) exit(OVERFLOW);
	S.top = S.base;
	S.stacksize = STACK_INIT_SIZE;
	return OK;
}

Status DestroyStack_OPND(SqStack_OPND& S) {
	//销毁栈S,S不再存在 
	free(S.base);
	S.stacksize = 0;
	return OK;
}

Status ClearStack_OPND(SqStack_OPND& S) {
	//把S置为空栈 
	S.top = S.base;
	return OK;
}

Status StackEmpty_OPND(SqStack_OPND S) {
	//若栈S为空栈,则返回TRUE,否则返回FALSE 
	if (S.top == S.base) return TRUE;
	else return FALSE;
}

int StackLength_OPND(SqStack_OPND S) {
	//返回S的元素个数,即栈的长度
	int len = S.top - S.base;
	return len;
}

OperandType GetTop_OPND(SqStack_OPND S) {
	//若栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR 
	OperandType e;
	if (S.base == S.top) return ERROR;
	e = *(S.top - 1);
	return e;
}

Status Push_OPND(SqStack_OPND& S, OperandType e) {
	//插入元素e为新的栈顶元素 
	if (S.top - S.base >= S.stacksize) {		//判断是否栈满
		S.base = (OperandType*)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(OperandType));
		if (!S.base) exit(OVERFLOW);
		S.top = S.base + S.stacksize;
		S.stacksize += STACKINCREMENT;
	}
	*S.top++ = e;
	return OK;
}

Status Pop_OPND(SqStack_OPND& S, OperandType& e) {
	//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR 
	if (S.top == S.base) return ERROR;
	e = *--S.top;
	return OK;
}

Status visit_OPND(OperandType x) {
	printf("%f\t", x);
	return OK;
}

Status StackTraverse_OPND(SqStack_OPND S, Status(*visit)(OperandType)) {
	//从栈底到栈顶依次对栈中每个元素调用函数visit(),一旦visit失败,则操作失败 
	OperandType* p;
	for (p = S.base; p < S.base + StackLength_OPND(S); p++)
		if (!visit(*p))
			return ERROR;
	return OK;
}

/*
	相	顾	无	相	识,
	长	歌	怀	采	薇。
*/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lanzer Linzeux

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值