用两种方式实现表达式自动计算
a->size--;
return a->num[--(a->top)]; /*得到栈顶的值*/ }
void push2(numstack *a,double num) /*入栈*/ {
a->size++;
a->num[(a->top)++]=num; }
int main(void) /*主函数*/ {
void change (char str[],char exp[]); /*声明要用到的各个函数*/
double CalResult(char exp[]); /*声明后缀表达式的计算函数*/ double Directcalresult(char str[]); int check(char str[],char chestr[100]);
char str[100],exp[100],chestr[100]; /*str存储原算术表达式,exp存储对
应的 printf(\算术表达式为:\\n\ 后缀表达式,chestr存储容错字符'^'*/
gets(str);
if(check(str,chestr)) /*调用容错函数*/ { printf(\表达式错在:\\n\ printf(\ }
exit(-1);
printf(chestr); /*根据输入情况指出错误的地方*/
change(str,exp); /*调用函数将中缀转化为后缀*/ printf(\后缀表达式为:%s\\n\
printf(\运算结果为: %f\\n\ /*调用函数计算后缀表达式*/ }
void change (char str[],char ch[]) /*将前缀表达式转化为后缀表达式*/ {
int i=0; /*str的索引*/ int k=0;
char c; /*字符串中取出的放在C中*/ stack st; /*定义符号栈*/ OpNode op; OpNode ops; c=str[i++]; {
if ( (c>='0'&&c<='9')||c=='.') /*如果字符为数字或小数点*/ {
init(&st); /*初始化符号栈*/
printf(\直接运算的结果为: %f\\n\ /*调用直接计算函数*/
while (c!='\\0') /*对字符串进行扫描*/
while ( (c>='0'&&c<='9')||c=='.')
- 6 -
用两种方式实现表达式自动计算
{
ch[k++]=c; /*将字符直接放入数组中*/
c=str[i++]; }
if (c=='(') /*如果字符是左括号*/ { }
if(c==')') /*如果字符为右括号*/ { }
if (c=='+'||c=='-') /*如果是+-号*/ {
op.level=1; /*优先级为1*/ { } else {
while (ops.level>=op.level) /*如果栈顶优先级高*/
{
ops=pop(&st);
ch[k++]=ops.op; /*将栈顶元素取出存入数组中*/
if (st.size>0) else
break;
ops=top(&st); /*进行判空操作,栈为空结束*/
push(&st,op); /*如果此时栈为空直接入栈*/ op=top(&st); /*首先观察栈顶*/
while (st.size!=0&&op.op!='(') /*如果不是左括号并且栈不为空*/ {
ch[k++]=op.op;
if (st.size>0) /*再次检查栈是否为空,*/ }
pop(&st); /*去掉左括号*/
op=top(&st);
else break; /*为空就结束*/ op.level=-1; /*定义其优先级为-1*/ push(&st,op); /*将左括号直接入栈*/ }
ch[k++]='|'; /*在其后面放入一个分隔符*/
op.op='(';
op=pop(&st); /*出栈并存入数组中*/
op.op=c; if (st.size==0)
ops=top(&st); /*观察栈顶*/
- 7 -
用两种方式实现表达式自动计算
}
if(c=='*'||c=='/'||c=='%') { op.op=c;
op.level=2; /*优先级为1*/ }
}
push(&st,op); /*此时栈顶优先级低,入栈*/
if (st.size==0)
{ push(&st,op); } else {
ops=top(&st); while (ops.level>=op.level) {
ops=pop(&st); ch[k++]=ops.op; if (st.size>0) ops=top(&st); else
break; }
push(&st,op); }
}
c=str[i++]; } while(st.size!=0) { ops=pop(&st); ch[k++]=ops.op;
}
ch[k]='\\0'; }
double CalResult(char exp[]) {
char c; numstack numst; double d1,d2,dr; int k=0; int i=0;
char *s; - 8 -
/*如果此时栈为空直接入栈*/ /*观察栈顶*/
/*如果栈顶优先级高*/ /*将栈顶元素取出存入数组中*/ /*进行判空操作,栈为空结束*/ /*此时栈顶优先级低,入栈*/ /*索引自加检索下一个字符*/
/*最后判断栈如果不为空*/
/*取出栈内元素存入数组中*/ /*将\\0作为结尾存入数组*/
/*后缀表达式的计算*/ /*建立数值栈*/
/*后缀表达式的索引*/
/*将字符转化为浮点数的索引*/
用两种方式实现表达式自动计算
char trans[100]; /*存字符表示的一段数字*/ init2 (&numst); /*实现数值栈*/ c=exp[k++];
while (c!='\\0') /*开始扫描后缀表达式*/ {
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='%') /*如果是操作符*/ { }
if (c>='0'&&c<='9'||c=='.') /*如果是字符表示的数字*/ {
{
case '+' : /*如果是加法操作*/
d2=pop2(&numst); d1=pop2(&numst);
dr=d1+d2; /*相加后入栈*/ push2(&numst,dr); break;
d2=pop2(&numst); d1=pop2(&numst);
dr=d1-d2; /*相减后入栈*/ push2(&numst,dr); break;
d2=pop2(&numst); d1=pop2(&numst);
dr=d1*d2; /*相乘后入栈*/ push2(&numst,dr); break;
d2=pop2(&numst); d1=pop2(&numst);
dr=d1/d2; /*相除后入栈*/ push2(&numst,dr); break;
d2=pop2(&numst); d1=pop2(&numst);
dr=(double)((int)d1%(int)d2); /*类型转化并取余后入栈*/ push2(&numst,dr); break;
switch(c)
case '-' : /*如果是减法操作*/
case '*' : /*如果是乘法操作*/
case '/' : /*如果是除法操作*/
case '%' : /*如果是取余操作*/
}
while(c>='0'&&c<='9'||c=='.')
- 9 -
用两种方式实现表达式自动计算
}
double Directcalresult(char str[]) /*表达式的直接计算出结果*/ {
stack ms; /*建立符号栈*/ numstack mns; /*建立数值栈*/ double calculate(double od1,double od2,OpNode op); int index=0; /*str的索引*/ int len=strlen(str); char c;
char trans[100]; /*存放数值的一段字符*/ int i=0; /*trans的索引*/ char * s; double d;
OpNode tempn; /*存放当前扫描的操作符*/ OpNode templn; double oda,odb,odr;
double result; /*作为返回值返回结果*/ init (&ms); /*实现两个栈*/ init2(&mns);
while(index c=str[index++]; if(c>='0'&&c<='9'||c=='.') /*如果是数字字符或小数点*/ { { } trans[i++]='\\0'; /*扫描完一个数结束数组*/ i=0; /*索引归0*/ trans[i++]=c; /*将其存入数组扫描下一个*/ c=str[index++]; } } c=exp[k++]; { } trans[i++]='\\0'; /*将表示数字的字符串结束*/ s=trans; /*将指针指向该数组*/ d1=atof(s); /*利用函数将字符串转化为浮点数*/ push2(&numst,d1); trans[i++]=c; /*将字符存入数组进行下一个的扫描*/ c=exp[k++]; i=0; return pop2(&numst); /*最后结果将在数值栈中,取出作为返回值*/ while(c>='0'&&c<='9'||c=='.') - 10 -