利用栈求表达式的值.docx

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

利用栈求表达式的值.docx

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

利用栈求表达式的值.docx

利用栈求表达式的值

题目:

利用栈求表达式的值

一.设计任务和目标

编写程序实现表达式求值,即验证某算术表达式的正确性,若正确,则计算该算术表达式的值。

主要功能描述如下:

1、从键盘上输入表达式。

2、分析该表达式是否合法:

(1)是数字,则判断该数字的合法性。

若合法,则压入数据到堆栈中。

(2)是规定的运算符,则根据规则进行处理。

在处理过程中,将计算该表达式的值。

(3)若是其它字符,则返回错误信息。

 

主要功能描述如下:

1、从键盘上输入表达式。

2、分析该表达式是否合法:

(1)是数字,则判断该数字的合法性。

若合法,则压入数据到堆栈中。

(2)是规定的运算符,则根据规则进行处理。

在处理过程中,将计算该表达式的值。

(3)若是其它字符,则返回错误信息。

程序应包括以下几个功能函数

voidinitstack();初始化堆栈

intMake_str();语法检查并计算

intpush_operate(intoperate):

将操作码压入堆栈

intpush_num(doublenum):

将操作数压入堆栈

intprocede(intoperate):

处理操作码

intchange_opnd(intoperate):

将字符型操作码转换成优先级

intpush_opnd(intoperate):

将操作码压入堆栈

intpop_opnd();将操作码弹出堆栈

intcaculate(interru_opnd):

简单计算+,-,*,/

doublepop_num():

弹出操作数

程序如下:

#include"stdio.h"

#include"string.h"

#include"stdlib.h"

#defineMAXLEN100

typedefstruct

{

charop;

intlevel;

}opt;

typedefstruct//定义操作符栈

{

optst[MAXLEN];

inttop;

}op_stack;

typedefstruct//定义值栈

{

doubleD[MAXLEN];

inttop;

}D_stack;

//--------对栈操作的定义-------------

optpeek(op_stack*s)//定义看栈顶函数

{

opterror=;

if(s->top>=0)

returns->st[s->top];

else

returnerror;

}

intIsEmpty(op_stack*s)//定义判断栈空的函数

{

if(s->top<0)

return0;

else

returns->st[s->top].op;

}

charpush(op_stack*s,optc)//定义入栈函数

{

s->top++;

s->st[s->top]=c;

returnc.op;

}

optpop(op_stack*s)//定义出栈函数

{

opti;

opterror=;

if(s->top>=0)

{

i=s->st[s->top];

s->st[s->top].op='\0';

s->top--;

returni;

}

else

returnerror;

}

voidclear(op_stack*s)//定义初始化栈

{

s->top=-1;

}

//-----------------------------definethevaluestack-----------------------

doubleDpeek(D_stack*s)//定义看栈顶函数

{

if(s->top>=0)

returns->D[s->top];

else

return0;

}

intDIsEmpty(D_stack*s)//定义判断栈空的函数

{

if(s->top<0)

return0;

else

return(int)(s->D[s->top]);

}

doubleDpush(D_stack*s,doublec)//定义入栈函数

{

s->top++;

s->D[s->top]=c;

returnc;

}

doubleDpop(D_stack*s)//定义出栈函数

{

doublei;

if(s->top>=0)

{

i=s->D[s->top];

s->D[s->top]='\0';

s->top--;

returni;

}

elsereturn0;

}

voidDclear(D_stack*s)//定义初始化栈

{

s->top=-1;

}

doublecalval(char*exp)

{

op_stackos;//定义两个栈

D_stackds;

chartmp[MAXLEN]=;

inti=0,leng;

doubledtmp,dpoptmp;

optA=;

optR=;

optM=;

optD=;

optB=;

optMo=;

clear(&os);

Dclear(&ds);

//-----定义初始化结束-----

while(*exp!

='\0')

{

while(*exp>='0'&&*exp<='9'||*exp=='.')

{

while(*exp>='0'&&*exp<='9'||*exp=='.')

{

tmp[i++]=*exp++;

}

dtmp=atof(tmp);

Dpush(&ds,dtmp);

leng=strlen(tmp);

for(i=0;i

{

tmp[i]='\0';

}

i=0;

}

//-------------------------------

switch(*exp)

{

case'+':

if(!

IsEmpty(&os)||peek(&os).level

{

push(&os,A);

*exp++;

}

else

{

while(IsEmpty(&os)&&peek(&os).level>=A.level)

{

switch(pop(&os).op)

{

case'%':

dpoptmp=Dpop(&ds);

dpoptmp=(float)((int)Dpop(&ds)%(int)dpoptmp);

Dpush(&ds,dpoptmp);

break;

case'*':

dpoptmp=Dpop(&ds)*Dpop(&ds);

Dpush(&ds,dpoptmp);

break;

case'/':

dpoptmp=Dpop(&ds);

dpoptmp=Dpop(&ds)/dpoptmp;

Dpush(&ds,dpoptmp);

break;

case'+':

dpoptmp=Dpop(&ds)+Dpop(&ds);

Dpush(&ds,dpoptmp);

break;

case'-':

dpoptmp=Dpop(&ds);

dpoptmp=Dpop(&ds)-dpoptmp;

Dpush(&ds,dpoptmp);

break;

}

}

push(&os,A);

*exp++;

}

break;

case'-':

if(!

IsEmpty(&os)||peek(&os).level

{

push(&os,R);

*exp++;

}

else

{

while(IsEmpty(&os)&&peek(&os).level>=R.level)

{

switch(pop(&os).op)

{

case'%':

dpoptmp=Dpop(&ds);

dpoptmp=(float)((int)Dpop(&ds)%(int)dpoptmp);

Dpush(&ds,dpoptmp);

break;

case'*':

dpoptmp=Dpop(&ds)*Dpop(&ds);

Dpush(&ds,dpoptmp);

break;

case'/':

dpoptmp=Dpop(&ds);

dpoptmp=Dpop(&ds)/dpoptmp;

Dpush(&ds,dpoptmp);

break;

case'+':

dpoptmp=Dpop(&ds)+Dpop(&ds);

Dpush(&ds,dpoptmp);

break;

case'-':

dpoptmp=Dpop(&ds);

dpoptmp=Dpop(&ds)-dpoptmp;

Dpush(&ds,dpoptmp);

break;

}

}

push(&os,R);

*exp++;

}

break;

case'*':

if(!

IsEmpty(&os)||peek(&os).level

{

push(&os,M);

*exp++;

}

else

{

while(IsEmpty(&os)&&peek(&os).level>=M.level)

{

switch(pop(&os).op)

{

case'%':

dpoptmp=Dpop(&ds);

dpoptmp=(float)((int)Dpop(&ds)%(int)dpoptmp);

Dpush(&ds,dpoptmp);

break;

case'*':

dpoptmp=Dpop(&ds)*Dpop(&ds);

Dpush(&ds,dpoptmp);

break;

case'/':

dpoptmp=Dpop(&ds);

dpoptmp=Dpop(&ds)/dpoptmp;

Dpush(&ds,dpoptmp);

break;

}

}

push(&os,M);

*exp++;

}

break;

case'/':

if(!

IsEmpty(&os)||peek(&os).level

{

push(&os,D);

*exp++;

}

else

{

while(IsEmpty(&os)&&peek(&os).level>=D.level)

{

switch(pop(&os).op)

{

case'%':

dpoptmp=Dpop(&ds);

dpoptmp=(float)((int)Dpop(&ds)%(int)dpoptmp);

Dpush(&ds,dpoptmp);

break;

case'*':

dpoptmp=Dpop(&ds)*Dpop(&ds);

Dpush(&ds,dpoptmp);

break;

case'/':

dpoptmp=Dpop(&ds);

dpoptmp=Dpop(&ds)/dpoptmp;

Dpush(&ds,dpoptmp);

break;

}

}

push(&os,D);

*exp++;

}

break;

case'%':

if(!

IsEmpty(&os)||peek(&os).level

{

push(&os,Mo);

*exp++;

}

else

{

while(IsEmpty(&os)&&peek(&os).level>=Mo.level)

{

switch(pop(&os).op)

{

case'%':

dpoptmp=Dpop(&ds);

dpoptmp=(float)((int)Dpop(&ds)%(int)dpoptmp);

Dpush(&ds,dpoptmp);

break;

case'*':

dpoptmp=Dpop(&ds)*Dpop(&ds);

Dpush(&ds,dpoptmp);

break;

case'/':

dpoptmp=Dpop(&ds);

dpoptmp=Dpop(&ds)/dpoptmp;

Dpush(&ds,dpoptmp);

break;

}

}

push(&os,Mo);

*exp++;

}

break;

case'(':

push(&os,B);

exp++;

break;

case')':

while(peek(&os).level!

=-2)

{

switch(pop(&os).op)

{

case'%':

dpoptmp=Dpop(&ds);

dpoptmp=(float)((int)Dpop(&ds)%(int)dpoptmp);

Dpush(&ds,dpoptmp);

break;

case'*':

dpoptmp=Dpop(&ds)*Dpop(&ds);

Dpush(&ds,dpoptmp);

break;

case'/':

dpoptmp=Dpop(&ds);

dpoptmp=Dpop(&ds)/dpoptmp;

Dpush(&ds,dpoptmp);

break;

case'+':

dpoptmp=Dpop(&ds)+Dpop(&ds);

Dpush(&ds,dpoptmp);

break;

case'-':

dpoptmp=Dpop(&ds);

dpoptmp=Dpop(&ds)-dpoptmp;

Dpush(&ds,dpoptmp);

break;

}

}

pop(&os);//弹出(

exp++;

break;

}

}

while(IsEmpty(&os))

{

switch(pop(&os).op)

{

case'%':

dpoptmp=Dpop(&ds);

dpoptmp=(float)((int)Dpop(&ds)%(int)dpoptmp);

Dpush(&ds,dpoptmp);

break;

case'*':

dpoptmp=Dpop(&ds)*Dpop(&ds);

Dpush(&ds,dpoptmp);

break;

case'/':

dpoptmp=Dpop(&ds);

dpoptmp=Dpop(&ds)/dpoptmp;

Dpush(&ds,dpoptmp);

break;

case'+':

dpoptmp=Dpop(&ds)+Dpop(&ds);

Dpush(&ds,dpoptmp);

break;

case'-':

dpoptmp=Dpop(&ds);

dpoptmp=Dpop(&ds)-dpoptmp;

Dpush(&ds,dpoptmp);

break;

}

}

returnDpop(&ds);

}

voidmain()

{

charstring[MAXLEN];

char*p=string;

printf("输入表达式:

\n");

gets(p);

printf("%s=%f\n\n",string,calval(p));

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

当前位置:首页 > PPT模板 > 商务科技

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

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