不知道怎么回事算不出来答案,以下是代码
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#define MAXSIZE 100
typedef char DataType;
typedef struct
{
DataType data[MAXSIZE];
int top;
}SqStack;
void InitStack(SqStack &S)
{
S.top= -1;
}
int StackEmpty(SqStack S)
//判栈为空栈时返回值为真,反之为假
{
return(S.top==-1?TRUE:FALSE);
}
int StackFull(SqStack S)
//判栈为满栈时返回值为真,反之为假
{
return(S.top==MAXSIZE-1?TRUE:FALSE);
}
void Push(SqStack &S,DataType e)
{ //将元素e插入到栈中,作为的新栈顶
if(StackFull(S))
return ; //栈满
S.top++; // top加1,栈顶位置上移
S.data[S.top]=e; //数据e存入当前栈顶
}
int Pop(SqStack &S,DataType &e)
{//若栈不为空,则删除栈顶元素
if(StackEmpty(S)) return 0; //栈空
e=S.data[S.top]; //取出数据放入e所指单元中
S.top--; // top减1,栈顶位置下移
}
int GetTop(SqStack S)
{
DataType e;
if(StackEmpty(S))
return 0;
e=S.data[S.top];
return e;
}
int In(DataType c)
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')
return 1;
else
return 0;
}
char Precede(char a,char b)
{
char z;
if((b=='+')||(b=='-')||(b=='')||(b=='/')||(b=='(')||(b==')') ||(b=='='))
switch (a)
{
case '+':
case '-': if((b=='')||(b=='/')||(b=='(')) z='<';
else z='>';
break;
case '*':
case '/': if(b=='(') z='<';
else z='>';
break;
case '(': if(b=='=') z='E';
else if(b==')')z='=';
else z='<';
break;
case ')':
if(b=='(') z='E';
else z='>';
break;
case '=':
if(b=='=')z='=';
else if(b==')') z='E';
else z='<';
break;
}
else z='E';
return(z);
}
int In(char ch) /判断字符ch是否为算符/
{
int i,flag=0;
char op[7]={'+','-','','/','(',')','='}; /算符数组/
for(i=0;i<7;i++)
if(*ch==op[i])
{
flag=1;
break;
}
return flag;
}
DataType Operate(DataType a,char theta,DataType b)
{
DataType z;
switch (theta)
{
case '+':z=a+b;
break;
case '-':z=a-b;
break;
case '':z=ab;
break;
case '/':z=a/b;
break;
}
return(z);
}
float CalculateExpression()
{ //算术表达式求值的算符优先算法。设optr和opnd分别
//OP为算符集合
SqStack optr,opnd;
char a,b,c,x,theta;
char *op;
InitStack(optr);
Push(optr,'=');
InitStack(opnd);
c=getchar();
while(c!='=' ||GetTop(optr)!='=')
{
if(!In(c))
{
Push(opnd,c);
c=getchar();
} //不是算符则进栈
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;
}
}
return GetTop(opnd);
}
int main()
{
float sum;
SqStack optr,opnd;
InitStack(optr);
InitStack(opnd);
sum=CalculateExpression()-'0';
printf("%d",sum);
return 0;
}