0
点赞
收藏
分享

微信扫一扫

四则混合运算的算数表达式求值

_鱼与渔_ 2022-01-09 阅读 64

源程序及注释

#include<iostream>

using namespace std;

#define ERROR 0

#define OK 1

typedef int SElemType;

typedef int Status;

#define MAXSIZE 100  //顺序栈存储空间的初始分配量

//顺序站的存储结构

typedef struct {

SElemType *base; //栈底指针

SElemType *top; //栈顶指针

int stacksize; //栈可用的最大容量

}SqStack;

//初始化操作

Status InitStack(SqStack &S)

{

//构造一个空栈

S.base = new SElemType[MAXSIZE]; //动态分配一个MAXSIZE的数组存储空间

if (!S.base)

{

cout << "初始化失败" << endl; //存储分配失败

exit(OVERFLOW);

}

cout << "初始化成功" << endl;

S.top = S.base; //top初始为base,空栈

S.stacksize = MAXSIZE; //stacksize放置栈的最大容量

return OK;

}

//入栈

Status Push(SqStack &S, SElemType e)

{

if (S.top - S.base == S.stacksize)

{

return ERROR;

}

*S.top++ = e;

//*S.top=e;

//S.top++;

return OK;

}

//出栈

Status Pop(SqStack &S, SElemType &e)

{//删除S的栈顶元素,用e返回其值

if (S.top == S.base)

return ERROR;

e = *--S.top;

return OK;

}

//取栈顶元素

Status GetTop(SqStack S)

{ //返回S的栈顶元素,不修改栈顶指针

if (S.top != S.base)

return *(S.top - 1);

}

//判断c是否为七种算符之一

bool In(char ch)

{

switch (ch)

{

case '+':

case '-':

case '*':

case '/':

case '(':

case ')':

case '#':return OK;

default:return ERROR;

}

}

//判断算符的优先级

char Precede(char c1, char c2) {

char  r;

//+-的判断相同

if ((c1 == '+' || c1 == '-') && (c2 == '+' || c2 == '-' || c2 == ')'

|| c2 == '#'))  r = '>';

else  if ((c1 == '+' || c1 == '-') && (c2 == '*' || c2 == '/'

|| c2 == '('))  r = '<';

//*/的判断相同

else if ((c1 == '*' || c1 == '/') && (c2 == '+' || c2 == '-' || c2 == ')' ||c2== '*' ||c2== '/'

|| c2 == '#'))

r = '>';

else  if ((c1 == '*' || c1 == '/') && (c2 == '('))

r = '<';

//"("判断

else  if ((c1 == '(')&&(c2== '+' ||c2== '-' ||c2== '*'

|| c2 == '/' || c2 == '('))

r = '<';

else  if (c1 == '('&&c2 == ')')

r = '=';

else  if (c1 == '('&&c2 == '#')

{

cout << "error!没有右括号!" << endl;

exit(-1);

}

//")"判断

else  if ((c1 == ')') && (c2 == '+' || c2 == '-' || c2 == '*'

|| c2 == '/' || c2 == '#'))

r = '>';

else  if (c1 == ')'&&c2 == '(')

{

cout << "error!" << endl;

exit(-1);

}

//"#"判断

else  if ((c1 == '#') && (c2 == '+' || c2 == '-' || c2 == '*'

|| c2 == '/' || c2 == '('))

r = '<';

else  if (c1 == '#'&&c2 == '#')

r = '=';

else  if (c1 == '#'&&c2 == ')')

{

cout << "error!" << endl;

exit(-1);

}

return r;

}

//计算

Status Operate(SElemType a, SElemType theta, SElemType b) {

char n = char(theta);  //强制转换成char型

switch (n)

{

case '+':  return a + b;

case '-':  return a - b;

case '*':  return a * b;

default:  if (b != 0)   return a / b;

  else

{

cout << "error!除数不能为0!" << endl;

exit(-1);

}

}

return OK;

}

//表达式求值

Status EvaluateExpression() {//算术表达式求值的算符优先算法,设OPTR和OPND分别为运算符栈和操作数栈

SqStack OPTR, OPND;

InitStack(OPND); //初始化OPND栈

InitStack(OPTR); //初始化OPTR栈

cout << "请输入这个算数表达式:(输入“#”代表结束)" << endl;

char ch;

SElemType a, b,theta,x,s;

Push(OPTR, '#'); //将表达式起始符“#”压入OPTR栈

cin >> ch;

while (ch != '#' || (GetTop(OPTR) != '#')) //表达式没有扫描完毕或OPTR的栈顶元素不为“#”

{

if (!In(ch)) {

s = ch - 48;

cin >> ch;

while (!In(ch))

{

s = s * 10 + ch- 48;

cin >> ch;

}

Push(OPND, s);

} //ch不是运算符则进OPND栈

else

switch (Precede(GetTop(OPTR), ch)) //比较OPTR的栈顶元素和ch的优先级

{

case '<':

Push(OPTR, ch);

cin >> ch; //当前字符ch压入OPTR栈,读入下一字符ch

break;

case  '>':

Pop(OPTR, theta); //弹出OPTR栈顶的运算符

Pop(OPND, b);

Pop(OPND, a); //弹出OPND栈顶的两个运算数

Push(OPND, Operate(a, theta, b)); //将运算结果压入OPND栈

break;

case '=': //OPTR的栈顶元素是“(”且ch是“)”

Pop(OPTR, x);

cin >> ch; //弹出OPTR栈顶的“(”,读入下一字符ch

break;

} //switch

} //while

return GetTop(OPND); //OPND栈顶元素即为表达式求值结果

}

Status main()

{

cout << "计算结果为" << EvaluateExpression()<< endl;

system("pause");

}

运行结果

 

举报

相关推荐

0 条评论