利用栈求表达式的值文档格式.docx

上传人:b****1 文档编号:15347237 上传时间:2022-10-29 格式:DOCX 页数:15 大小:254.37KB
下载 相关 举报
利用栈求表达式的值文档格式.docx_第1页
第1页 / 共15页
利用栈求表达式的值文档格式.docx_第2页
第2页 / 共15页
利用栈求表达式的值文档格式.docx_第3页
第3页 / 共15页
利用栈求表达式的值文档格式.docx_第4页
第4页 / 共15页
利用栈求表达式的值文档格式.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

利用栈求表达式的值文档格式.docx

《利用栈求表达式的值文档格式.docx》由会员分享,可在线阅读,更多相关《利用栈求表达式的值文档格式.docx(15页珍藏版)》请在冰豆网上搜索。

利用栈求表达式的值文档格式.docx

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(*

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 可爱清新

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1