用C编写一个简单的计算器,能实现加减乘除就可以了,
3Q了,急用
[解决办法]
#include<stdio.h>
#include<malloc.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
typedef struct{
char * base;
char * top;
int stacksize;
}SqStack1;
typedef struct{
float * base;
float * top;
int stacksize;
}SqStack2;
SqStack1 OPTR;
SqStack2 OPND;
char InitStack(SqStack1 &S) //建立空栈OPTR
{
S.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
if (!S.base)
exit(0);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
float InitStack(SqStack2 &S) //建立空栈OPND
{
S.base=(float*)malloc(STACK_INIT_SIZE*sizeof(float));
if (!S.base)
exit(0);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
char Push(SqStack1 &S,char e) // 插入元素
{
if(S.top-S.base>=S.stacksize)
{
S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
if(!S.base)
exit(0);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}
float Push(SqStack2 &S,float e) // 插入元素
{
if(S.top-S.base>=S.stacksize)
{
S.base=(float*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(float));
if(!S.base)
exit(0);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}
char GetTop(SqStack1 S,char &e) //取栈顶元素
{
if(S.top==S.base)
return ERROR;
else
{
e=*(S.top-1);
return e;
}
}
float GetTop(SqStack2 S,float &e) //取栈顶元素
{
if(S.top==S.base)
return ERROR;
else
{
e=*(S.top-1);
return OK;
}
}
char Pop(SqStack1 &S,char &e)
{
if(S.top==S.base)
return ERROR;
e=*--S.top;
return e;
}
float Pop(SqStack2 &S,float &e)
{
if(S.top==S.base)
return ERROR;
e=*--S.top;
return e;
}
char Precede(char a, char b) // 判定运算符栈的栈顶运算符与读入的运算符之间的优先关系
{
if(((a=='+'||a=='-')&&(b=='+'||b=='-'||b==')'||b=='#'))
||((a=='*'||a=='/')&&(b=='+'||b=='-'||b=='*'||b=='/'||b==')'||b=='#')))
return'>';
else
{
if((a=='('&&(b==')')||(a=='#'&&b=='#')))
return'=';
else
return'<';
}
}
float Operate(float x,char theta,float y) //进行二元运算
{
float z;
if(theta=='+')
z=x+y;
if(theta=='-')
z=x-y;
if(theta=='*')
z=x*y;
if(theta=='/'&&y!=0)
z=x/y;
return(z);
}
in(char c)
{
switch(c)
{
case'+':
case'-':
case'*':
case'/':
case'(':
case')':
case'#':return(OK);
default:return(ERROR);
}
}
float EvaluateExpression()
{
char c,x,theta,e;
float d,a,b;
InitStack(OPTR);
Push(OPTR,'#');
InitStack(OPND);
c=getchar();
while(c!='#'||GetTop(OPTR,e)!='#')
{
if(c=='=')
c='#';
if(!in(c))
{
d=c-'0';
Push(OPND,d);
}
else
{
switch(Precede(GetTop(OPTR,e),c))
{
case'<':
Push(OPTR,c);
break;
case'=':
Pop(OPTR,x);
break;
case'>':
Pop(OPTR,theta);
Pop(OPND,b);
Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
continue;
}
}
c=getchar();
}
return Pop(OPND,d);
}
void main()
{
printf("请输入表达式:\n");
printf("%9.2f",EvaluateExpression());
}