#include<stdio.h>
#include<string.h>
int cal(int liftx,int rightx,char op) //找到对应运算符 返回运算结果
{
if(op=='+')
return liftx+rightx;
else
if(op=='-')
return liftx-rightx;
else
if(op=='*')
return liftx*rightx;
else
return liftx/rightx;
}
int leval(char op) //返回运算符优先级
{
switch(op)
{
case '*':
case '/': return 2;
case '+':
case '-': return 1;
case '(': return 0;
case '@': return -1;
}
}
int caculate(char e[]) //分离运算符 和 数字 并返回运算结果
{
char sop[81]; //运算符栈
int snu[81]; //数值栈
int x1,x2,y,i=0;
int top1=-1,top2=-1;
char op;
sop[++top1]='@'; //指定@优先级最低,入栈低,方便其它运算符出栈 、入栈
while(e[i]) //分离数值和运算符 调用cal和leval函数
{
if(e[i]>='0'&&e[i]<='9')
{
y=0;
while(e[i]>='0'&&e[i]<='9') //遍历运算符前整数
{
y=y*10+(e[i]-'0');
i++;
}
snu[++top2]=y; //整数入栈
i--;
}
else
if(e[i]=='(') //左括号直接入栈
{
sop[++top1]=e[i];
}
else if(e[i]==')') //遇到右括号 进行运算
{
while(sop[top1]!='(')
{
op=sop[top1--];
x1=snu[top2--];x2=snu[top2--];
snu[++top2]=cal(x2,x1,op);
}
top1--;//左括号出栈
}
else if(e[i]=='+'||e[i]=='-'||e[i]=='*'||e[i]=='/')
{
op=sop[top1--]; //高优先级运算符出栈
x1=snu[top2--];x2=snu[top2--];
snu[++top2]=cal(x2,x1,op); //运算结果入栈
}
sop[++top1]=e[i]; //当前运算符直接入栈
}
i++;
}
while(top1) //运算符栈剩余运算符依次出栈进行运算
{
op=sop[top1--];
x1=snu[top2--];
x2=snu[top2--];
snu[++top2]=cal(x2,x1,op);
}
return snu[top2]; //返回表达式运算结果
}
int main(void)
{
char e[81];
int y;
printf("请输入一个算数表达式:");
gets(e); //输入数学表达式
y=caculate(e);
printf("%s=%d\n",e,y);
}
#include<string.h>
int cal(int liftx,int rightx,char op) //找到对应运算符 返回运算结果
{
if(op=='+')
return liftx+rightx;
else
if(op=='-')
return liftx-rightx;
else
if(op=='*')
return liftx*rightx;
else
return liftx/rightx;
}
int leval(char op) //返回运算符优先级
{
switch(op)
{
case '*':
case '/': return 2;
case '+':
case '-': return 1;
case '(': return 0;
case '@': return -1;
}
}
int caculate(char e[]) //分离运算符 和 数字 并返回运算结果
{
char sop[81]; //运算符栈
int snu[81]; //数值栈
int x1,x2,y,i=0;
int top1=-1,top2=-1;
char op;
sop[++top1]='@'; //指定@优先级最低,入栈低,方便其它运算符出栈 、入栈
while(e[i]) //分离数值和运算符 调用cal和leval函数
{
if(e[i]>='0'&&e[i]<='9')
{
y=0;
while(e[i]>='0'&&e[i]<='9') //遍历运算符前整数
{
y=y*10+(e[i]-'0');
i++;
}
snu[++top2]=y; //整数入栈
i--;
}
else
if(e[i]=='(') //左括号直接入栈
{
sop[++top1]=e[i];
}
else if(e[i]==')') //遇到右括号 进行运算
{
while(sop[top1]!='(')
{
op=sop[top1--];
x1=snu[top2--];x2=snu[top2--];
snu[++top2]=cal(x2,x1,op);
}
top1--;//左括号出栈
}
else if(e[i]=='+'||e[i]=='-'||e[i]=='*'||e[i]=='/')
{
//比较当前运算符与栈顶运算符优先级 当前运算符低 栈内高优先级运算符依照优先级高低依次进行运算
{
op=sop[top1--]; //高优先级运算符出栈
x1=snu[top2--];x2=snu[top2--];
snu[++top2]=cal(x2,x1,op); //运算结果入栈
}
sop[++top1]=e[i]; //当前运算符直接入栈
}
i++;
}
while(top1) //运算符栈剩余运算符依次出栈进行运算
{
op=sop[top1--];
x1=snu[top2--];
x2=snu[top2--];
snu[++top2]=cal(x2,x1,op);
}
return snu[top2]; //返回表达式运算结果
}
int main(void)
{
char e[81];
int y;
printf("请输入一个算数表达式:");
gets(e); //输入数学表达式
y=caculate(e);
printf("%s=%d\n",e,y);
}