#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define OK 1
#define TRUE 1
#define FALSE 0
#define BAI 100
#define SHI 10
typedef char SElemType;
typedef float ElemType;
//存放符号的栈
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
//存放数字的栈
typedef struct
{
ElemType *base;
ElemType *top;
int stacksize;
}Stack;
//运算符结构体
struct A
{
char m;
int n;
}Fu[5];
//构造一个符号栈
void InitStack(SqStack *S)
{
S->base=(SElemType*)malloc(BAI*sizeof(SElemType));
if(!S->base)
exit(FALSE);
S->top=S->base; //栈初始化的时候头和尾指向相同
S->stacksize=BAI;
}
//*****符号入栈
int Push(SqStack *S,SElemType e)
{
if(S->top-S->base>=S->stacksize) //检查是否满,如果满了再添加内存
{
S->base=(SElemType *)realloc(S->base,(S->stacksize+SHI)*sizeof(SElemType));
if(!S->base)
exit(FALSE);
S->top=S->base+S->stacksize; //内存可能从新分配,所以top重新
S->stacksize=+SHI;
}
*S->top++=e;
return OK;
}
//*****符号出栈
int Pop(SqStack *S,SElemType e)
{
if(S->top==S->base) //头尾相同则说明是个空栈
{
printf("\t出现错误!\n\n");
printf("\t缺少符号!\n\n");
exit(0);
}
e=*--S->top;
return OK;
}
//*****返回符号栈的长度
int StackLength(SqStack *S)
{
return S->top-S->base;
}
//返回符号栈顶元素
char GetTop(SqStack *S)
{
if(S->top==S->base)
return FALSE;
return *(S->top-1);
}
//构造一个数字栈
void SInitStack(Stack *S)
{
S->base=(ElemType*)malloc(BAI*sizeof(ElemType));
if(!S->base)
exit(FALSE);
S->top=S->base; //栈初始化的时候头和尾指向相同
S->stacksize=BAI;
}
//*****数字入栈
int SPush(Stack *S,ElemType e)
{
if(S->top-S->base>=S->stacksize) //检查是否满,如果满了再添加内存
{
S->base=(ElemType *)realloc(S->base,(S->stacksize+SHI)*sizeof(ElemType));
if(!S->base)
exit(FALSE);
S->top=S->base+S->stacksize; //内存可能从新分配,所以top重新
S->stacksize=+SHI;
}
*S->top++=e;
return OK;
}
//*****数字出栈
int SPop(Stack *S,ElemType e)
{
if(S->top==S->base) //头尾相同则说明是个空栈
{
printf("\t出现错误!\n\n");
printf("\t缺少数字!\n\n");
exit(0);
}
e=*--S->top;
return OK;
}
//*****返回数字栈的长度
int SStackLength(Stack *S)
{
return S->top-S->base;
}
//返回数字栈顶元素
float SGetTop(Stack *S)
{
if(S->top==S->base)
return FALSE;
return *(S->top-1);
}
//****主界面
int jiemian()
{
int n;
printf("\n\t\t欢迎使用计算器\t\n\n");
printf("\t1开始\t\n\t其他退出\n");
scanf("%d",&n);
getchar();
return n;
}
//传统优先级
void chuantong() //传统优先级*、/为第一优先级,+、-为第二优先级
{
Fu[0].m='+';
Fu[1].m='-';
Fu[2].m='*';
Fu[3].m='/';
Fu[4].m='(';
Fu[0].n=1;
Fu[1].n=1;
Fu[2].n=2;
Fu[3].n=2;
Fu[4].n=0;
}
//计算
float Operate(float a,char c,float b)
{
switch(c)
{
case'+':
return a+b;
break;
case'-':
return a-b;
break;
case'*':
return a*b;
break;
case'/':
return a/b;
break;
}
}
//判断符号的等级
int fuhao(char a,char b)
{
int i,j;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
if(Fu[i].m==a&&Fu[j].m==b)
{
return Fu[i].n-Fu[j].n; //优先级越高数值越大
}
}
//表达式计算
int jisuan(SqStack *S,Stack *Z)
{
char c,shu[10],a;
int i=0,j,b=1;
float m=0,n=0.1,p,q;
c=getchar();
while(1)
{
if(('0'<=c&&c<='9')||'.'==c) //输入数字的时候先以字符串的方式储存下来
{
shu[i++]=c;
c=getchar();
}
else
{
if(0!=i) //当输入的不是数字时把原来存储字符串的数字转换成浮点型然后压入栈
{
for(j=0;j<i;)
{
if('.'==shu[j])
{
j++;
b=0;
}
if(b)
{
m=m*10+(shu[j]-'0');
}
else
{
m=m+(shu[j]-'0')*n;
n=n*0.1;
}
j++;
}
n=0.1;
i=0;
b=1;
SPush(Z,m);
m=0;
}
if('('==c) //左括号时入栈
{
Push(S,c); //左括号入符号栈
c=getchar(); //接着读下一个字符
}
else if(')'==c) //当是右括号时计算括号内的内容
{
Pop(S,a); //符号栈出栈
if('('==a) //判断刚出栈的符号是不是左括号
{
c=getchar(); //如果是左括号说明括号内运算完了,接收下个字符
}
else //不是左括号说明没运算玩,接着运算
{
SPop(Z,q); //数字栈出栈,用于运算
SPop(Z,p); //数字栈出栈,用于运算
SPush(Z,Operate(p,a,q)); //调用Operate计算,然后把计算结果入数字栈
}
}
else if('+'==c||'-'==c||'*'==c||'/'==c)//当是运算符的时候判断前一个运算符,前一个运算符高的时候运算
{ //否则入栈
if(0==StackLength(S)) //判断符号栈是否为空
{
Push(S,c); //符号入符号栈
c=getchar(); //接着接收下个字符
}
else if(fuhao(GetTop(S),c)>=0) //调用fuhao函数判断栈顶元素和刚接收的符号的优先级
{ //如果栈顶元素优先级高活相等就运算
Pop(S,a); //符号出栈
SPop(Z,q); //数字出栈
SPop(Z,p); //数字出栈
SPush(Z,Operate(p,a,q));//调用Operate计算,然后把计算结果入数字栈
}
else //如果刚接收的符号的优先级高则入栈
{
Push(S,c); //符号入符号栈
c=getchar(); //接着接收下个字符
}
}
else if('='==c) //当是等号的时候
{
//当输入等号时符号栈中应该至少有一个符号,数字栈中应该有两个数字
Pop(S,a); //符号栈出栈
SPop(Z,q); //数字栈出栈
SPop(Z,p); //数字栈出栈
SPush(Z,Operate(p,a,q));//调用Operate计算,然后把计算结果入数字栈
if(1==SStackLength (Z) )//判断数字栈是否就剩一个数字
{ //如果就剩一个数字则说明运算结束
if(0!=StackLength(S))//判断符号栈是否为空
{ //运算结束符号栈应该为空,不为空则说明输入错误
printf("输入有错!\n");//错误提示
return 0; //结束该函数
}
SPop(Z,n); //最后一个数字即运算结果出栈
printf("%7.3f\n",n); //输出运算结果
return 0; //结束该函数
}
}
else //如果接受的既不是数字又不是运算符还不是等号则说明输入非法字符
{
printf("\t\t出错!\n\n\t输入非法字符!或未输入等号!\n\n");//错误提示
return 0; //结束该函数
}
}
}
}
//****主函数
int main()
{
SqStack S; //定义一个符号栈
Stack Z; //定义一个整数栈
int n;
InitStack(S); //对符号栈进行初始化
SInitStack(Z); //对数字栈进行初始化
n=jiemian();
while(n==1)
{
system("cls"); //清除显示器上前面的东西
chuantong();
jisuan(S,Z);
printf("\t1:继续计算\n\t其他键退出计算\n\t:");
scanf("%d",&n);
system("cls"); //清除显示器上前面的东西
if(1!=n)
break;
getchar();
n=1;
}
}
程序有这些问题,但是k'y正常运行