支持四则运算、小括号、中括号、乘方运算、小数运算
//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;
}
/*
相 顾 无 相 识,
长 歌 怀 采 薇。
*/