利用栈求表达式的值文档格式.docx
《利用栈求表达式的值文档格式.docx》由会员分享,可在线阅读,更多相关《利用栈求表达式的值文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
intchange_opnd(intoperate):
将字符型操作码转换成优先级
intpush_opnd(intoperate):
intpop_opnd():
将操作码弹出堆栈
intcaculate(intcur_opnd):
简单计算+,-,*,/
doublepop_num():
弹出操作数
源代码:
#include<
stdio.h>
stdlib.h>
string.h>
math.h>
#defineMAXSIZE100
#defineN1000
inti=0;
//表达式数
typedefstructexpression//表达式结构
{
longdoubleresult;
charexpstr[MAXSIZE];
}expression;
expressionexpr[N];
//表达式的一个整体容器s
typedefstruct//操作码栈定义
charcode[MAXSIZE];
inttop;
}opnd;
typedefstruct//操作数栈定义
doubledate[MAXSIZE];
}num;
//《——opnd栈操作——》:
voidinitstack(opnd*op)//初始化栈
op->
top=-1;
}
intempty_opnd(opnd*op)//判空
if(op->
top==-1)
return0;
elsereturn1;
intpush_opnd(opnd*op,charco)//压栈
top==MAXSIZE-1)
printf("
The\"
opnd\"
stackisfull."
);
top++;
code[op->
top]=co;
return1;
charpop_opnd(opnd*op)//出栈
chara='
\0'
;
error:
stackisempty."
returna;
a=op->
top];
top--;
charget_opnd(opnd*op)//查看栈顶
else
returnop->
//《——num栈操作——》:
voidinitstack(num*nu)
nu->
intempty_num(num*nu)//判空
if(nu->
intpush_num(num*nu,doubleda)//压栈
date\"
date[nu->
top]=da;
doublepop_num(num*nu)//出栈
doublea='
a=nu->
doubleget_num(num*nu)//查看栈顶
top!
=-1)
returnnu->
//《——结束栈定义操作——》
//《——函数操作——》:
intchange_opnd(charcode)//将字符型操作码转换成优先级,非表达式字符反回-2
switch(code)
case'
='
:
break;
)'
return2;
+'
return3;
-'
*'
return4;
/'
('
//操作码级别>
=0;
1'
2'
3'
4'
5'
6'
7'
8'
9'
0'
.'
return-1;
//操作数级别=-1;
default:
return-2;
//其它符号级别=-2
charprocede(chartop,charcode)//处理操作码,判断栈的操作
if(change_opnd(code)==0)//“(”入栈
return('
<
'
if(change_opnd(code)==2&
&
change_opnd(top)==0)//“(”和“)”同时出现,“(”出栈,“)”不入栈
if(change_opnd(code)<
=change_opnd(top))//弹出两个数字和一个符号进行计算
>
//入栈
doublechange_num(charstr[])//数字字符串转成double型数字
char*s=str;
intp=1,q=0;
//p=小数点前位数,q=小数点后位数
chard[]="
."
z[]="
0"
doubleda=0,p1;
if(strstr(str,d)==0)//判断是否有小数点
p=strlen(str);
if(strstr(str,d)==str)//没有输入小数点前的数,如“.032”
p=1;
q=strlen(str)-1;
strcpy(str,strcat(z,str));
p=strstr(str,d)-str;
q=strlen(str)-p-1;
for(inti=0;
i<
p;
i++)
//小数点前的各位数乘以各自的阶数,然后叠加:
123=1*100+2*10+3*1
da=da+((int)str[i]-48)*pow(10,p-i-1);
for(intj=0;
j<
q;
j++)
//小数点后的各位数乘以各自的阶数,然后叠加:
0.123=1*0.1+2*0.01+3*0.001
da=da+((int)str[strlen(str)-1-j]-48)*pow(0.1,q-j);
returnda;
intmake_str()//语法检查
char*p,*p1;
intn=0;
\n请输入表达式,以“=”结尾:
"
gets(expr[i].expstr);
p=expr[i].expstr;
p1=p;
while
(1)
if(*p=='
)
if(*(p-1)=='
)//语法检查结束
{//没有以"
="
结尾
\n表达式以\"
=\"
结尾。
请重新输入:
n=0;
continue;
if(change_opnd(*p)==2)//一个"
)"
,n-1
n--;
if(change_opnd(*p)==0)//一个"
("
,n+1
n++;
if(*p1==*p)//第一个字符的判断,只能以“数字”或“(”开头,不能有非法字符
if(change_opnd(*p)>
0)
\n表达式只能以“数字”或“(”开头。
if(change_opnd(*p)==-2)
\n表达式\"
%c\"
为非法字符。
*p);
{//合法刚跳到下一个字符
p=p+1;
if(change_opnd(*p)==-2)//非法字符判断
if(change_opnd(*p)==0)//"
前一个字符只能是"
+、-、*、/、("
if(change_opnd(*