⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lijiting 060810101.cpp

📁 编写表达式计算程序
💻 CPP
字号:
#include <iostream.h> 
#include <malloc.h> 
#include <stdio.h> 
#define STACK_INIT_SIZE 100 
#define STACKINCREMENT 10 
#define OK 1 
#define ERROR 0 
#define TRUE 1 
#define FLASE 0 
#define OVERFLOW 0 
typedef int Status; 
typedef double SElemType; 
typedef struct { 
SElemType *base; 
SElemType *top; 
int stacksize; 
}SqStack; 
Status InitStack(SqStack &S) //构造一个空栈 
{ 
S.base = ( SElemType * )malloc(STACK_INIT_SIZE * sizeof(SElemType) ); 
if(!S.base) return OVERFLOW; 
S.top=S.base; 
S.stacksize=STACK_INIT_SIZE; 
return OK; 
} 
Status Push(SqStack &S,SElemType e)//入栈操作 
{ 
*S.top++=e; 
return OK; 
} 
Status Pop(SqStack &S,SElemType &e)//出栈操作 
{ 
if(S.top==S.base) return ERROR; 
e=*--S.top; 
return OK; 
} 
double GetTop(SqStack S)//取栈顶元素 
{ 
if(S.base==S.top) return 0; 
SElemType e=*(S.top-1); 
return e; 
} 
int In(char c)//判断是不是运算数 
{ 
if(c<='9'&&c>='0'||c=='.') return 0; 
else return 1; 
} 
char Precede(char a,char c)//判断运算符的优先关系 
{ 
char b[7][7]={'>','>','<','<','<','>','>', 
'>','>','<','<','<','>','>', 
'>','>','>','>','<','>','>', 
'>','>','>','>','<','>','>', 
'<','<','<','<','<','=',' ', 
'>','>','>','>',' ','>','>', 
'<','<','<','<','<',' ','='}; 
int i,j; 
switch(a){ 
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(c){ 
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 b[i][j]; 
} 
double operate (double a,double theta,double b)//计算表达式 
{ //a-=48,b-=48; //ascll码变为数字 
int theta1=theta; 
switch(theta1){ 
case '+': 
return a+b; 
case '-': 
return a-b; 
case '*': 
return a*b; 
case '/': 
return a/b; 
default : return 0; 
}//switch 
} 
double EvaluateExpress() 
{ SqStack OPTR,OPND; 
InitStack(OPTR); 
Push(OPTR, '='); 
InitStack(OPND); 
cout<<"输入整个表达式,以=号键结束"<<endl; 
double x,a,b; 
double theta; 
char c=getchar(); 
while(c!='='|| GetTop(OPTR)!='='){ 
if(!In(c)) { 
double d=c-48,dian=0; //化为10进制 
for( c=getchar();In(c)==0;c=getchar())/*读入数字序列*/ 
if(c=='.') 
{dian=1;} 
else 
{d=10*d+c-48;dian=dian*10.;} 
if(dian!=0.)d=d/dian; 
Push(OPND,d); 
} //c为运算数,先化ASCll码为十进制数,再入OPND栈, 
//if(In(c))//不能只用一个else,否则发生错误 
switch(Precede(GetTop(OPTR),c)){ 
case '<': 
Push(OPTR, c);c=getchar(); //栈顶元素优先? 
break; 
case '=': 
Pop(OPTR, x); c=getchar(); //脱括号并接受下一个字符 
break; 
case '>': //退栈并将运算结果入栈 
Pop(OPTR,theta); 
Pop(OPND,b); 
Pop(OPND,a); 
Push(OPND,operate(a,theta,b)); 
break; 
case ' ': 
return ERROR; 
}//switch 
}//while 
return GetTop(OPND); 
} 
void main() 
{double result; 
result=EvaluateExpress(); 
cout<<"表达式的运算结果是"<<result<<endl; 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -