中缀表达式求值
合理运用栈,按照运算优先级,编程实现任意中缀算术表达式(可以只包含’+’、’-‘、’*’、’/’等双目运算符、小括号和结束符)的求值运算。
通过操作符栈和操作数栈实现求值。
遇见数字,直接压入操作数栈,遇见操作符时:
1.当栈外优先级高于栈内优先级时:将操作符压入栈
2.当栈外优先级低于栈内优先级时:输出栈顶的操作符,从操作数栈中取出栈顶的两个数进行计算后的结果压入栈
3.当栈外优先级等于栈内优先级时,如果操作符栈栈顶=’(’,退栈不输出
相同等级运算符栈内高于栈内
int isp(char op)
{
switch(op)
{
case '#':return 0;break;
case '(':return 1;break;
case '*':return 5;break;
case '/':return 5;break;
case '+':return 3;break;
case '-':return 3;break;
case ')':return 6;break;
}
}
int icp(char op)
{
switch(op)
{
case '#':return 0;break;
case '(':return 6;break;
case '*':return 4;break;
case '/':return 4;break;
case '+':return 2;break;
case '-':return 2;break;
case ')':return 1;break;
}
}
完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define stsize 50
#define maxsize 100
int isp(char op)
{
switch(op)
{
case '#':return 0;break;
case '(':return 1;break;
case '*':return 5;break;
case '/':return 5;break;
case '+':return 3;break;
case '-':return 3;break;
case ')':return 6;break;
}
}
int icp(char op)
{
switch(op)
{
case '#':return 0;break;
case '(':return 6;break;
case '*':return 4;break;
case '/':return 4;break;
case '+':return 2;break;
case '-':return 2;break;
case ')':return 1;break;
}
}
bool dooperator(double opnd[],int *k,char op)
{
double left,right;
int t=*k;
if(t==-1)
{
return false;
}
right=opnd[t--];
if(t==-1)
{
return false;
}
left=opnd[t--];
switch(op)
{
case '+':opnd[++t]=left+right;break;
case '-':opnd[++t]=left-right;break;
case '*':opnd[++t]=left*right;break;
case '/':
if(right==0)
{
printf("不能除以0\n");
return false;
}
else
{
opnd[++t]=left/right;
}
break;
default: return false;
}
return true;
}
double cal(char in[])
{
int i=0,j=0,k=-1,m;
double opnd[stsize];
char ch=in[i++],str[stsize];
char optr[stsize],ch1,op;
int top=-1;
optr[++top]='#';
while(ch!='#')
{
if(ch>='0'&&ch<='9'||ch=='.')
{
while(ch>='0'&&ch<='9'||ch=='.')
{
str[j++]=ch;
ch=in[i++];
}
opnd[++k]=strtod(str,NULL);
for(m=0;m<j;m++)
{
str[m]='#';
}
j=0;
}
else
{
ch1=optr[top];
if(isp(ch1)<icp(ch))
{
optr[++top]=ch;
ch=in[i++];
}
else if(isp(ch1)>icp(ch))
{
while(isp(ch1)>icp(ch))
{
op=optr[top--];
if(!dooperator(opnd,&k,op))
{
printf("运算出错\n");
}
else
{
k--;
}
ch1=optr[top];
}
if(isp(ch1)==icp(ch))
{
op=optr[top--];
}
if(isp(ch1)<icp(ch))
{
optr[++top]=ch;
}
ch=in[i++];
}
else
{
op=optr[top--];
if(op=='(')
ch=in[i++];
}
}
}
while(top!=-1)
{
op=optr[top--];
if(!dooperator(opnd,&k,op));
else
{
k--;
}
}
return opnd[k--];
}
int main()
{
char in[maxsize];
gets(in);
printf("运算结果为:%lf\n",cal(in));
}
对于浮点数或着多位数,入栈时要形成一个整体。我是通过建立一个字符串数组存入数字,再将数字转化为一个浮点数压入栈。