(C++) 输入一个由数字、+、-、*、/及括号组成的自述表达式,求其值。
答案:6 悬赏:10 手机版
解决时间 2021-03-29 04:07
- 提问者网友:世勋超人
- 2021-03-28 15:38
(C++) 输入一个由数字、+、-、*、/及括号组成的自述表达式,求其值。
最佳答案
- 五星知识达人网友:风格不统一
- 2021-03-28 16:36
我学数据结构时做过一个实验,跟这个很像,不过我还扩展了一下,可以计算小数、负数,得分很高哦。。。
.........stack.h...................
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 2
typedef float SElemType_f;
typedef char SElemType_ch;
typedef int Status;
#include
#include
#define OK 1
#define ERROR 0
typedef struct SqStack_f{
SElemType_f *base;
SElemType_f *top;
int stacksize;
}SqStack_f;
typedef struct SqStack_ch{
SElemType_ch *base;
SElemType_ch *top;
int stacksize;
}SqStack_ch;
Status InitStack(SqStack_f &S){
S.base=new SElemType_f[STACK_INIT_SIZE];
if(!S.base)
exit(ERROR);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
Status InitStack(SqStack_ch &S){
S.base=new SElemType_ch[STACK_INIT_SIZE];
if(!S.base)
exit(ERROR);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
float GetTop_f(SqStack_f &S){
float e;
if(S.top==S.base)
return ERROR;
e=*(S.top-1);
return e;
}
char GetTop_ch(SqStack_ch &S){
char e;
if(S.top==S.base)
return ERROR;
e=*(S.top-1);
return e;
}
void Push_f(SqStack_f &S,SElemType_f e){
if(S.top-S.base==S.stacksize)
cout<<"栈满,无法压栈!"< *S.top++=e;
}
void Push_ch(SqStack_ch &S,SElemType_ch e){
if(S.top-S.base==S.stacksize)
cout<<"栈满,无法压栈!"< *S.top++=e;
}
float Pop_f(SqStack_f &S,float &e){
if(S.top==S.base)
return ERROR;
e=*--S.top;
return e;
}
char Pop_ch(SqStack_ch &S,char &e){
if(S.top==S.base)
return ERROR;
e=*--S.top;
return e;
}
.........calculator.cpp.............
#include"stack.h" //自己定义的栈的头文件
#include //getchar()头文件
#include
char Precede(char t1,char t2)
{ // 判断两符号的优先关系
char f;
switch(t2){
case '+':
case '-':if(t1=='('||t1=='=')
f='<';
else
f='>';
break;
case '*':
case '/':if(t1=='('||t1=='='||t1=='+'||t1=='-')
f='<';
else
f='>';
break;
case '(':if(t1==')'){
cout<<"您的输入有误,请重新输入!"<<"\n"; //提示出错
exit(0);
}
else
f='<';
break;
case ')':if(t1=='='){
cout<<"您的输入有误,请重新输入!"<<"\n"; //提示出错
exit(0);
}
else if(t1=='(')
f='=';
else f='>';
break;
case '=':if(t1=='('){
cout<<"您的输入有误,请重新输入!"<<"\n"; //提示出错
exit(0);
}
else if(t1=='=')
f='=';
else f='>';
break;
}
return f;
}
int In(char c){ //判断c是否为运算符
int i;
switch(c){
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '=':return OK;
default:return ERROR;
}
return i;
}
float Operate(float a,char theta,float b){ //进行运算的函数
float c;
switch(theta){
case '+':c=a+b;break;
case '-':c=a-b;break;
case '*':c=a*b;break;
case '/':if(b==0.0){
cout<<"分母不能为零!"< }
c=a/b;break;
default:cout<<"错误的运算符!"< }
return c;
}
float EvaluateExpression(){
// 算术表达式求值的算符优先算法。设OPTR和OPND分别为运算符栈和运算数栈
SqStack_f OPND;
SqStack_ch OPTR;
char c,x,theta;
char buf[16]; //将运算数存入buf[]数组
float a,b;
int i=0;
char line[100];
int h=0;
cin.getline(line,100); //读入一行字符
float j=10,k=0,z=0.0;
InitStack(OPTR); Push_ch(OPTR,'=');
InitStack(OPND);
c=line[h];
int l=strlen(line);
if(c=='-'){ //若第一个字符是'-',说明是负号,相当于 “0 -”,所以将0存入buf中
buf[0]=0;
i=1;
}
for(int m=0;m if(line[m]=='='){
cout<<"等号输入有误!"< }
}
if(strlen(line)==0||c=='='){ //未输入字符或只有一个“=”时,给出提示
cout<<"您没有输入表达式!"< }
if(line[strlen(line)-1]!='='){ //表示式不是以“=”结束时,提示错误
cout<<"未输入等号!"< }
while(c!='='||GetTop_ch(OPTR)!='='){ //依次读入字符,直到表达式求值完毕
if(!In(c)){ //非运算符的情况
if(c>='0'&&c<='9'){ //c为0~9之间的运算数
if(k==0){ //k为已出现的小数点的个数
buf[i]=c;
z=z*10+c-48; //小数点之前z的表达式
i++;
}
else if(k==1){ //出现小数点后
buf[i]=c;
z=z+(c-48)/j; //小数点之后每位都要缩小相应的倍数
j*=10;
i++;
}
else{
cout<<"小数点输入错误!"< }
}
else if(c=='.'){
k++; //每出现一个小数点,k的值加一
i++;
}
else{
cout<<"您输入了非法字符!"< }
h++;
c=line[h];
}
else{
if(i>0){ //即buf[]内有运算数存在
Push_f(OPND,z); //将运算数压入运算数栈
z=0.0; //分别将z、i置零,j=10,准备下一次转换运算数并存储
k=0;j=10;
i=0;
}
if(line[h]=='('&&line[h+1]=='-') //某个字符是'(',且下一个字符是'-',说明是负号,相当于 “0 -”,所以将0压入运算数栈中
Push_f(OPND,0);
switch(Precede(GetTop_ch(OPTR),c)){ //比较OPTR栈顶元素和c的优先级
case '<': //c进OPTR栈
Push_ch(OPTR,c);
h++;
c=line[h];
break;
case '=': //弹出左括号
Pop_ch(OPTR,x);
h++;
c=line[h];
break;
case '>': //栈顶运算符退栈、计算,结果进OPND栈
Pop_ch(OPTR,theta);
Pop_f(OPND,b);
Pop_f(OPND,a);
Push_f(OPND,Operate(a,theta,b));
break;
}
}
}
return GetTop_f(OPND);
}
void main(){
while(1){
cout<<"***********************请输入算术表达式,并以=结束******************************"< float n;
n=EvaluateExpression();
cout< }
}
.........stack.h...................
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 2
typedef float SElemType_f;
typedef char SElemType_ch;
typedef int Status;
#include
#include
#define OK 1
#define ERROR 0
typedef struct SqStack_f{
SElemType_f *base;
SElemType_f *top;
int stacksize;
}SqStack_f;
typedef struct SqStack_ch{
SElemType_ch *base;
SElemType_ch *top;
int stacksize;
}SqStack_ch;
Status InitStack(SqStack_f &S){
S.base=new SElemType_f[STACK_INIT_SIZE];
if(!S.base)
exit(ERROR);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
Status InitStack(SqStack_ch &S){
S.base=new SElemType_ch[STACK_INIT_SIZE];
if(!S.base)
exit(ERROR);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
float GetTop_f(SqStack_f &S){
float e;
if(S.top==S.base)
return ERROR;
e=*(S.top-1);
return e;
}
char GetTop_ch(SqStack_ch &S){
char e;
if(S.top==S.base)
return ERROR;
e=*(S.top-1);
return e;
}
void Push_f(SqStack_f &S,SElemType_f e){
if(S.top-S.base==S.stacksize)
cout<<"栈满,无法压栈!"<
}
void Push_ch(SqStack_ch &S,SElemType_ch e){
if(S.top-S.base==S.stacksize)
cout<<"栈满,无法压栈!"<
}
float Pop_f(SqStack_f &S,float &e){
if(S.top==S.base)
return ERROR;
e=*--S.top;
return e;
}
char Pop_ch(SqStack_ch &S,char &e){
if(S.top==S.base)
return ERROR;
e=*--S.top;
return e;
}
.........calculator.cpp.............
#include"stack.h" //自己定义的栈的头文件
#include
#include
char Precede(char t1,char t2)
{ // 判断两符号的优先关系
char f;
switch(t2){
case '+':
case '-':if(t1=='('||t1=='=')
f='<';
else
f='>';
break;
case '*':
case '/':if(t1=='('||t1=='='||t1=='+'||t1=='-')
f='<';
else
f='>';
break;
case '(':if(t1==')'){
cout<<"您的输入有误,请重新输入!"<<"\n"; //提示出错
exit(0);
}
else
f='<';
break;
case ')':if(t1=='='){
cout<<"您的输入有误,请重新输入!"<<"\n"; //提示出错
exit(0);
}
else if(t1=='(')
f='=';
else f='>';
break;
case '=':if(t1=='('){
cout<<"您的输入有误,请重新输入!"<<"\n"; //提示出错
exit(0);
}
else if(t1=='=')
f='=';
else f='>';
break;
}
return f;
}
int In(char c){ //判断c是否为运算符
int i;
switch(c){
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '=':return OK;
default:return ERROR;
}
return i;
}
float Operate(float a,char theta,float b){ //进行运算的函数
float c;
switch(theta){
case '+':c=a+b;break;
case '-':c=a-b;break;
case '*':c=a*b;break;
case '/':if(b==0.0){
cout<<"分母不能为零!"<
c=a/b;break;
default:cout<<"错误的运算符!"<
return c;
}
float EvaluateExpression(){
// 算术表达式求值的算符优先算法。设OPTR和OPND分别为运算符栈和运算数栈
SqStack_f OPND;
SqStack_ch OPTR;
char c,x,theta;
char buf[16]; //将运算数存入buf[]数组
float a,b;
int i=0;
char line[100];
int h=0;
cin.getline(line,100); //读入一行字符
float j=10,k=0,z=0.0;
InitStack(OPTR); Push_ch(OPTR,'=');
InitStack(OPND);
c=line[h];
int l=strlen(line);
if(c=='-'){ //若第一个字符是'-',说明是负号,相当于 “0 -”,所以将0存入buf中
buf[0]=0;
i=1;
}
for(int m=0;m
cout<<"等号输入有误!"<
}
if(strlen(line)==0||c=='='){ //未输入字符或只有一个“=”时,给出提示
cout<<"您没有输入表达式!"<
if(line[strlen(line)-1]!='='){ //表示式不是以“=”结束时,提示错误
cout<<"未输入等号!"<
while(c!='='||GetTop_ch(OPTR)!='='){ //依次读入字符,直到表达式求值完毕
if(!In(c)){ //非运算符的情况
if(c>='0'&&c<='9'){ //c为0~9之间的运算数
if(k==0){ //k为已出现的小数点的个数
buf[i]=c;
z=z*10+c-48; //小数点之前z的表达式
i++;
}
else if(k==1){ //出现小数点后
buf[i]=c;
z=z+(c-48)/j; //小数点之后每位都要缩小相应的倍数
j*=10;
i++;
}
else{
cout<<"小数点输入错误!"<
}
else if(c=='.'){
k++; //每出现一个小数点,k的值加一
i++;
}
else{
cout<<"您输入了非法字符!"<
h++;
c=line[h];
}
else{
if(i>0){ //即buf[]内有运算数存在
Push_f(OPND,z); //将运算数压入运算数栈
z=0.0; //分别将z、i置零,j=10,准备下一次转换运算数并存储
k=0;j=10;
i=0;
}
if(line[h]=='('&&line[h+1]=='-') //某个字符是'(',且下一个字符是'-',说明是负号,相当于 “0 -”,所以将0压入运算数栈中
Push_f(OPND,0);
switch(Precede(GetTop_ch(OPTR),c)){ //比较OPTR栈顶元素和c的优先级
case '<': //c进OPTR栈
Push_ch(OPTR,c);
h++;
c=line[h];
break;
case '=': //弹出左括号
Pop_ch(OPTR,x);
h++;
c=line[h];
break;
case '>': //栈顶运算符退栈、计算,结果进OPND栈
Pop_ch(OPTR,theta);
Pop_f(OPND,b);
Pop_f(OPND,a);
Push_f(OPND,Operate(a,theta,b));
break;
}
}
}
return GetTop_f(OPND);
}
void main(){
while(1){
cout<<"***********************请输入算术表达式,并以=结束******************************"<
n=EvaluateExpression();
cout<
}
全部回答
- 1楼网友:青尢
- 2021-03-28 18:48
给你写个简单的吧,哈哈一定要给分啊!==哦
- 2楼网友:詩光轨車
- 2021-03-28 17:38
(1+1-1*1/1)=1
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯