算术表达式求值演示

2025-04-05 02:07:14
推荐回答(3个)
回答(1):

#include
#include

using namespace std;

int Operate(int x,char op,int y) //四则运算符的运算定义
{
switch(op){
case'+': return x+y;
case'-': return x-y;
case'*': return x*y;
case'/': return x/y;
}
}

char Precede(char op1,char op2) //判断符号的优先级
{

if(((op1=='+'||op1=='-')&&(op2=='+'||op2=='-'||op2==')'||op2=='#'))||((op1=='*'||op1=='/')&&(op2=='+'||op2=='-'||op2=='*'||op2=='/'||op2==')'||op2=='#')))
return '>';
if((op1=='('&&op2==')')||(op1=='#'&&op2=='#'))
return '=';
else
return '<';
}

void Tonumber(char &c,stack &OPND) //转化为数字
{ int number=0;

if(((c-'0')>=0&&(c-'0')<=9))
{
while(((c-'0')>=0&&(c-'0')<=9))
{
number=number*10+(c-'0');
cin>>c;
}
OPND.push(number);
}

}

int main()
{
stack OPTR;
stack OPND;//设OPTR和OPND分别为运算符栈和运算数栈

OPTR.push('#'); //出栈时的结尾判断

char c,op1,op2,op;
int x,y,temp=1;
cout<<"输入表达式,以'#'结束:";
cin>>c;
while(c!='#'||OPTR.top()!='#')
{
Tonumber(c,OPND);
if(c!='+'&&c!='-'&&c!='*'&&c!='/'&&c!='('&&c!=')'&&c!='#')
{
OPND.push(c);
cin>>c;
}
else
{
op1=OPTR.top();
op2=c;
switch(Precede(op1,op2))
{
case '<': //栈顶元素优先级低
OPTR.push(c);
cin>>c;
break;
case '=': //脱括号并接受下一个字符
OPTR.pop();
cin>>c;
break;
case '>': op=OPTR.top(); //退栈并将运算结果入栈
OPTR.pop();
x=OPND.top();
OPND.pop();
y=OPND.top();
OPND.pop();
OPND.push(Operate(y,op,x));
int a=OPND.top();
break;
}
}
}
cout<<"计算结果是:"< return 0;
}

但愿你和我不是一个学校的,我和你的作业一样......是基于严蔚敏老师那本数据结构编的。表达式后要加个'#'作为结束符

回答(2):

你可以在 参考资料 链接指向的页面中找到一个描述相关算法的文章。

回答(3):

网上有例程
#include
#include
#include
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct{
int *base;
int *top;
int stacksize;
}SqStack;
void InitStack(SqStack *s)
{
s->base=(int *)malloc(STACK_INIT_SIZE *sizeof(int));
if(!s->base) exit(1);
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
}
void GetTop(SqStack *s,int *e)
{
if(s->top==s->base)
{
printf("ERROR!\n");
exit(1);
}
*e=*(s->top-1);
}
void Push(SqStack *s,int e)
{
if(s->top-s->base>=s->stacksize)
{
s->base=(int *)realloc(s->base,(s->stacksize+STACKINCREMENT*sizeof(int)));
if(!s->base)
{
printf("overflow!");
exit(1);
}
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*s->top++=e;
}
void Pop(SqStack *s,int *e)
{
if(s->top==s->base)
exit(1);
*e=*--s->top;
}
int precede(int Top_char,int s1_char)
{
int i,pre[2],op[2];
op[0]=Top_char;
op[1]=s1_char;
for(i=0;i<2;i++)
switch(op[i])
{
case'(': case')': pre[i]=0;break;
case'+': case'-': pre[i]=1;break;
case'*': case'/': pre[i]=2;break;
case'^': pre[i]=3;break;
}
if(pre[0]>=pre[1])
return 1;
else return 0;
}
void Translate(char *s1)
{
char s2[80];
SqStack Optr;
int i=0,j=0,t;
InitStack(&Optr);
Push(&Optr,'(');
while(s1[i]!='3')
{
if(s1[i]>='0'&&s1[i]<='9')
{
s2[j++]=s1[i];
if(s1[i+1]<'0'||s1[i+1]<'9')
s2[j++]=' ';
}
else
switch(s1[i])
{
case'(': Push(&Optr,s1[i]);break;
case')': Pop(&Optr,&t);
while(t!='(')
{
s2[j++]=t;
Pop(&Optr,&t);
}
break;
default: while(GetTop(&Optr,&t),precede(t,s1[i]))
{
Pop(&Optr,&t);
s2[j++]=t;
}
Push(&Optr,s1[i]);
}
i++;
}
Pop(&Optr,&t);
while(t!='(')
{
s2[j++]=t;
Pop(&Optr,&t);
}
for(i=0;i s1[i]=s2[i];
s1[i]='#';
}
void Calculate(SqStack *s,char *s2)
{
int i,j,m,x,y,z;
i=0;
while(s2[i]!='#')
{
if(s2[i]>='0'&&s2[i]<='9')
{
m=0;
while(s2[i]!=' ')
{
m=m*10+(s2[i]-'0');
i++;
}
i++;
Push(s,m);
}
else
{
Pop(s,&x);
Pop(s,&y);
switch(s2[i])
{
case'+': z=y+x; printf("%d\n",z);break;
case'-': z=y-x; break;
case'*': z=y*x; printf("%d\n",z);break;
case'/': z=y/x; break;
case'^': z=1; for(j=1;j<=x;j++) z=z*y;
}
Push(s,z);
i++;
}
}
}
void result(SqStack *s)
{
int v;
GetTop(s,&v);
printf("The result is:%d\n",v);
}
void main()
{
SqStack stack;
char str[80];
gets(str);
InitStack(&stack);
Translate(str);
Calculate(&stack,str);
result(&stack);
}