算术表达式
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
算术表达式——C++
算术表达式
表达式求值是数学中的一个基本问题,也是程序设计中的一个经典问题。我们所涉及的表达式中包含数字(一位正整数)和运算符号,本课程设计中处理的运算符号包括‘+’、‘-’、‘*’、‘/’、‘(’和‘)’。要求按照我们所习惯的计算顺序,正确计算出表达式的值,并输出至屏幕上。为了计算方便,表达式以#号开始,并以#号结束输入。
一、函数目录
创建栈并初始化(InitStack)
入栈(Push)
出栈(Pop)
判断操作符函数(In)
取栈顶元素(GetTop)
优先级函数(Precede)
求值函数(Operate)
数字转化(number)
表达式求值函数(EvaluateExpression)
其他:操作符栈(OPTR),操作数栈(OPND)
判断优先级
。
// 通过建立二位数组将优先级关系写入,然后switch-case进行选择
char pre[7][7] = { ///优先级表
// + - * / ( ) #
{'>', '>', '<', '<', '<', '>', '>'}, // +
{'>', '>', '<', '<', '<', '>', '>'}, // -
{'>', '>', '>', '>', '<', '>', '>'}, // *
{'>', '>', '>', '>', '<', '>', '>'}, // /
{'<', '<', '<', '<', '<', '=', '0'}, // (
{'>', '>', '>', '>', '0', '>', '>'}, // )
{'<', '<', '<', '<', '<', '0', '='} // #
};
进行二元计算`。
// 进行计算
char Operate(char a, char theta, char b)
{
switch(theta){
case '+':
return a+b;
break;
case '-':
return a-b;
break;
case '*':
return a*b;
break;
case '/':
if(b!='0'){ //b不能为0
return a/b;
break;
}
else{
cout<<"Divisor can not be 0!"; //提示输出,可不用写
break;
}
}
}
数字转化
// 将数字的字符串转化为整型
int number(char ch)
{
return (int)(ch-'0');
}
二、完整代码
#include<iostream>
using namespace std;
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW 0
typedef char Status;
typedef char SElemType;
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
//初始化空栈
Status InitStack(SqStack &S)
{
S.base = new SElemType[MAXSIZE];
if(!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = MAXSIZE;
return OK;
}
//入栈操作
Status Push(SqStack &S, char e)
{
//栈顶插入元素e
if(S.top - S.base == S.stacksize) return ERROR;
*S.top ++= e;
return OK;
}
//出栈操作
Status Pop(SqStack &S, char &e)
{
//弹出栈顶元素, 不修改栈顶元素
if(S.top == S.base)
return ERROR;
e = *--S.top;
return OK;
}
//判断输入的字符是否为数字
int In(char ch)
{
switch(ch){
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '#':
return 1;
default:
return 0;
}
}
//弹出栈顶元素
char GetTop(SqStack S)
{
//返回栈顶元素, 不修改栈顶指针
if(S.top != S.base)
return *(S.top-1);
}
//判断运算符的优先级
Status Precede(char cd, char ch)
{
int i, j;
char pre[7][7] = { ///优先级表
// + - * / ( ) #
{'>', '>', '<', '<', '<', '>', '>'}, // +
{'>', '>', '<', '<', '<', '>', '>'}, // -
{'>', '>', '>', '>', '<', '>', '>'}, // *
{'>', '>', '>', '>', '<', '>', '>'}, // /
{'<', '<', '<', '<', '<', '=', '0'}, // (
{'>', '>', '>', '>', '0', '>', '>'}, // )
{'<', '<', '<', '<', '<', '0', '='} // #
};
switch(cd){
case '+':
i = 0;
break;
case '-':
i = 1;
break;
case '*':
i = 2;
break;
case '/':
i = 3;
break;
case '(':
i = 4;
break;
case ')':
i = 5;
break;
case '#':
i = 6;
break;
}
switch(ch){
case '+':
j = 0;
break;
case '-':
j = 1;
break;
case '*':
j = 2;
break;
case '/':
j = 3;
break;
case '(':
j = 4;
break;
case ')':
j = 5;
break;
case '#':
j = 6;
break;
}
return pre[i][j];
}
//进行二元运算
char Operate(char a, char theta, char b)
{
switch(theta){
case '+':
return a+b;
break;
case '-':
return a-b;
break;
case '*':
return a*b;
break;
case '/':
if(b!='0'){
return a/b;
break;
}
else{
cout<<"Divisor can not be 0!";
break;
}
}
}
//数字转化
int number(char ch)
{
return (int)(ch-'0');
}
//进行运算操作
char EvaluateExpression()
{
SqStack OPND; //寄存操作数
SqStack OPTR; // 寄存运算符
char a, b;
char theta, x; //接收弹出栈的字符
InitStack(OPND); //初始化OPND栈
InitStack(OPTR); //初始化OPTR栈
Push(OPTR, '#'); ///因为已经压入#,所以输入时不用在输入#
char ch;
cout<<"请开始输入:"<<endl;
cin>>ch;
while(ch!='#' || GetTop(OPTR)!='#'){ //输入#结束输入
if(!In(ch)){
int k;
k = number(ch); //如果是数字的话就进行转换
Push(OPND, k); //是数字就压入操作数栈
cout<<"请开始输入:"<<endl;
cin>>ch;
}
else
switch(Precede(GetTop(OPTR), ch))
{
case '<':
Push(OPTR, ch);
cout<<"请开始输入:"<<endl;
cin>>ch;
break;
case '>':
Pop(OPTR, theta);
Pop(OPND, b); Pop(OPND, a);
Push(OPND, Operate(a, theta, b));
break;
case '=':
Pop(OPTR, x);
cout<<"请开始输入:"<<endl;
cin>>ch;
break;
}
}
return GetTop(OPND);
}
int main()
{
int a;
a = EvaluateExpression();
printf("%d", a);
return 0;
}
测试结果
测试数据:#2*(3+4)-6/3#
测试结果: