首页 > 编程知识 正文

栈在表达式计算中的应用,栈的运用之表达式的运算

时间:2023-05-06 19:36:29 阅读:181707 作者:339

此任务需要实现函数doublecomputeinfix(char*s )来计算骑马订表达式。

在知识中拼写公式的计算需要堆栈。 关于链路存储堆栈,实现了以下内容:

创建堆栈:

创建链堆栈。 具体操作函数的定义如下。 LinkStack* LS_Create (; 释放堆栈:

释放堆栈占用的空间。 具体的操作函数的定义是voidls_free(linkstack*ls ); 清空堆栈:

使链栈成为空栈。 具体的操作函数的定义是voidls_makeempty(linkstack*ls ); 确定堆栈是否为空:

如果堆栈为空,则返回true;否则返回false。 具体操作函数的定义如下。 boolls_isempty(linkstack*ls ); 求堆栈的长度:

获取链堆栈的长度。 具体操作函数的定义如下。 intls_length(linkstack*ls ); 将元素x放入堆栈:

把x放到堆里。 堆栈满了就不能进入堆栈,返回false。 否则返回true。 具体的操作函数的定义为voidls_push(linkstack*ls,T x ); 出栈:

堆栈的元素放入item中。 如果堆栈成功(如果堆栈不为空),则返回true; 否则,(空堆栈),返回false。 具体操作函数的定义如下。 boolls_pop(linkstack*ls,T item ); 获取堆栈顶部元素:

获取堆栈顶部元素并将其放入item中。 如果获取失败,则返回false;如果获取失败,则返回true。 具体操作函数的定义如下。 boolls_top(linkstack*ls,T item ); 打印堆栈中的元素:

从堆栈顶部到堆栈底部打印每个节点的数据元素。 具体的操作函数的定义是voidls_print(linkstack*ls )。 在计算骑马订公式的过程中,可以根据需要调用上述操作。 由于表达式的计算结果可能是浮点数,因此这里将堆栈的数据元素类型设置为double类型。

类型双精度t; //为了计算数据元素类型和骑马订表达式,还定义了以下函数: 其中1 )已经实现,需要实现2 )。

1 ) :

voidcompute(linkstack*so,LinkStack* sd ); /*so表示运算符堆栈sd表示操作数堆栈*/此函数的处理步骤:

从运算符堆栈中堆栈运算符;

从操作数堆栈中堆栈两个操作数;

用堆栈的运算符运算堆栈的操作数;

将运算结果放入操作数堆栈。

2 ) :

doublecomputeinfix(char*s; /*s是骑马订式的符号串,公式为7(8时,s(0)=’7 ),s )1)=’,s )2)=’8’。 此函数返回表达式的计算结果。 *2)的实现过程中,可以调用1 )。 为了简化实现,假设表达式的操作数都是非负的,并且是要在此插入代码片段的位数。 在后面的测试中,输入数据满足这个要求。

# include stdio.h # include stdlib.h # include ' lnk stack.h ' # include ' infix.h ' void compute (link stack * so, LinkStack* sd )//sd运算符堆栈//sd操作数堆栈//1运算符从堆栈中堆栈一个运算符//2运算符堆栈两个操作数//3运算符对堆栈的操作数进行运算ls_pop(so,c ); ls_pop(SD,a ); ls_pop(SD,b ); if(c=='* ' ) { d=b*a; }elseif(c=='/' ) { d=b/a; }elseif(c==' ' ) { d=b a; }elseif(c=='-' ) { d=b-a; }else{printf('neveroccur!' ); }ls_push(SD,d ); }doublecomputeinfix(char*s ) /计算中缀公式({ int i=0; LinkStack* so=LS_Create (; //运算符堆栈LinkStack* sd=LS_Create (; //操作数堆栈while(s(I ) (if ) )0)=s (I ) s )=)9) ) ls_push ) SD,s ) I )-48 ); 连续; }if(s[i ]=='(||ls_isempty ) so ) ) ls_push ) so,s[I] ); 连续; (if ) s ) I )==' ) ) ) { T topitem; while(ls_top ) so,topitem ) topitem!=' ' () )计算(so,sd ); }ls_pop(so,topitem ); I; 连续; }if(s ) I )=='*'|s ) I )=='/' ) { T c; ls_top(so,c ); if(c=='*'|c=='/' )计算(so,sd ); }ls_push(so,s[i ]; 连续; }if(s[I]==''||s[I]='-' ) { T topitem; while(ls_top ) so,topitem ) topitem!=' ' () )计算(so,sd ); }ls_push(so,s[i ]; 连续; } } while (! ls_isempty(so ) ) compute ) so,sd; } T res; ls_top(SD,res ); ls_free(so; ls_free(SD; 返回结果; () ) ) ) )。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。