该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
以下是程序,可能比较长,主要的问题是比如计算表达式6+3*(9-5)/2-8可得结果是4,但是如果输入3*4,则得到结果'
#include
using namespace std;
#include
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef int Status;
typedef struct
{
char *base;
char *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &S)
{
S.base=new char[100];
if(!S.base) exit(OVERFLOW);
else S.top=S.base;
S.stacksize=MAXSIZE;
return OK;
}
Status Push(SqStack &S,char e)
{
if(S.top-S.base==S.stacksize) return ERROR;
else *S.top++=e;
return OK;
}
char GetTop(SqStack S)
{
if(S.top!=S.base)
return *(S.top-1);
else exit(ERROR);
}
Status Pop(SqStack &S,char &e)
{
if(S.top==S.base) return ERROR;
else {--S.top;e=*S.top;}
return OK;
}
Status In(char c)
{
if(c>='0'&&c<='9') return 0;
else if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#') return 1;
else exit(ERROR);
}
int Precede(char a,char b)//a为栈顶元素,b为读到的元素//令a等于b为7,a大于b为8,a小于b为9
{
if(b=='+')
{
if(a=='('||a=='#') return(9);
else return(8);
}
if(b=='-')
{
if(a=='('||a=='#') return(9);
else return(8);
}
if(b=='*')
{
if(a=='*'||a=='/'||a==')') return(8);
else return(9);
}
if(b=='/')
{
if(a=='*'||a=='/'||a==')') return(8);
else return(9);
}
if(b=='(') return(9);
if(b==')')
{
if(a=='(') return(7);
return(8);
}
if(b=='#')
{
if(a=='#') return(7);
else return(8);
}
}
int Operate(int a,char theta,int b)
{
if(theta=='+') return (a+b-'0');
else if(theta=='-') return (a-b+'0');
else if(theta=='*') return ((a-'0')*(b-'0')+'0');
else if(theta=='/') return ((a-'0')/(b-'0')+'0');
}
char EvaluateExpression(char s[])
{
char x,theta,ch;
char a,b,r;
int i;
SqStack OPTR,OPND;
InitStack(OPTR);
InitStack(OPND);
Push(OPTR,'#');
for(i=0;i
{
ch=s[i];
if(!(r=In(ch))){Push(OPND,ch);}
else
{
switch(Precede(GetTop(OPTR),ch))
{
case 9://a小于b为9
Push(OPTR,ch);
break;
case 8://a大于b为8//应该是从此处开始无法将字符输入到OPTR中
Pop(OPTR,theta);
Pop(OPND,b);
Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
i=i-1;
break;
case 7://a等于b为7
Pop(OPTR,x);
break;
}
}
}
return GetTop(OPND);
}
int main()
{
cout<
cout<
char e[100];
gets(e);
char result;
result=EvaluateExpression(e);
cout<
cout<
cout<
return 0;
}