永发信息网

(C++) 输入一个由数字、+、-、*、/及括号组成的自述表达式,求其值。

答案:6  悬赏:10  手机版
解决时间 2021-03-29 04:07
(C++) 输入一个由数字、+、-、*、/及括号组成的自述表达式,求其值。
最佳答案
我学数据结构时做过一个实验,跟这个很像,不过我还扩展了一下,可以计算小数、负数,得分很高哦。。。
.........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< }
}
全部回答
给你写个简单的吧,哈哈一定要给分啊!==哦
(1+1-1*1/1)=1
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
电弧炉熔炼气割渣行吗?以气割渣为原料,采用
合肥蜀山区潜山路111号是什么地方
腌制的辣椒有白毛?
11万V变电站有什么危害?多少米范围内不受影
住在哈尔滨征仪路上的大众嘉园,附近有菜市场
潮州夜市 ???
呼市的金白富酒店在哪了
k1094次列车南充到蓬安在几站台上车?
如何解决:请教nutch和solr集成问题
配子个数怎么理解
qq飞车中与青檬心情上装搭配的女装的是什么
王一博拍过什么电视剧?
水过滤器的滤芯的粉吃进肚子会怎么样?滤芯用
为什么乙醇氧化成乙醛后乙醛的还原性反而比乙
一个两层的书架共有360本书上层的本数是下层
推荐资讯
今天大姑来了。周记
1951年1月7日生今年多少岁
2018年北京理综25题有问题!丙烯高温条件下和
三国志13开局怎么有同道
所望算是大品牌吗?
“皇君圣后总为恩,复待祈让无捐赠。一切有情
请教HR,如果是在职研究生,对跳槽有多少用
海尔和美的天然气热水器那个好些
哪里卖硒鼓lexmark e120 多少钱
为什么我一问问题,就会有个人关注我?
“我来自大二年级,六班,”用英语怎么说
乌鲁木齐离宝山有多少里公里
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?