数据结构模拟计算器课程设计Word文件下载.docx

上传人:b****1 文档编号:13354339 上传时间:2022-10-10 格式:DOCX 页数:13 大小:74.86KB
下载 相关 举报
数据结构模拟计算器课程设计Word文件下载.docx_第1页
第1页 / 共13页
数据结构模拟计算器课程设计Word文件下载.docx_第2页
第2页 / 共13页
数据结构模拟计算器课程设计Word文件下载.docx_第3页
第3页 / 共13页
数据结构模拟计算器课程设计Word文件下载.docx_第4页
第4页 / 共13页
数据结构模拟计算器课程设计Word文件下载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

数据结构模拟计算器课程设计Word文件下载.docx

《数据结构模拟计算器课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构模拟计算器课程设计Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。

数据结构模拟计算器课程设计Word文件下载.docx

栈来进出运算的数字将后缀表达式的值求出即可。

3、数据结构定义

一般表达式的长度不会过长所以将顺序栈的容量设为100已经算是比较大了

具体数据结构如下:

#definemaxsize100typedefdoubledatatypel;

typedefchardatatype2;

typedefstructstack1

{

datatype1data1[maxsize];

inttop1;

/*栈顶元素*/

}seqstack1,*pseqstack1;

/*顺序栈*/

typedefstructstack2

datatype2data2[maxsize];

inttop2;

}seqstack2,*pseqstack2;

4、系统功能模块介绍

(1)判断字符是否为操作数函数intisnum(char)当输入表达式时要利用栈对表达式中的数字和符号进行进栈出栈,因此要判断表达式中的内容是操作数、运算符还是界限符,给出相关信息。

(2)求运算符优先级函数intpriority(char)对输入的表达式中的内容,若为运算符和界限符则要判断其优先级已完成其计算的先后顺序。

(3)中缀表达式转换为后缀表达式函数intinfix_exp_value(char*,char*)我们平时使用的为中缀表达式,但若利用栈则利用后缀表达式比较容易计算,因此要将中缀表达式转换为后缀表达式,具体算法步骤如下:

<

1>

count=O,初始化运算符栈s,将结束符’#'

加入运算符栈s中。

<

2>

读表达式字符=>

w。

3>

当栈顶为‘#'

并且w也是‘#'

时结束;

否则循环做下列步骤:

3.1>

如果w是操作数

判断若count==0

直接输出,读下一个字符=>

w;

转<

若count!

=0

追加字符'

@'

,读下一个字符=>

w,转<

3.2>

w若是运算符,则:

count=1;

321>

如果栈顶为‘(’并且w为‘)’则‘(’出栈不输出,读下一个字符=>

w,转<

如果栈顶为‘(’或者栈顶优先级小于w优先级,则w入栈,读下一个字符=>

w,转<

否则:

从运算符栈中出栈并输出,转<

(4)后缀表达式的求值函数doublepostfix_exp(char*)

使用一个操作数栈,当从左到右扫描表达式时,每遇到一个操作数就送入栈中保存,如果操作数不止一位,则保存在operand中,遇到下一个操作数时,执行operand=operand*10+(ch-'

0'

),便可将操作数转化为数字。

每遇到一个运算符就从栈中取出两个操作数进行当前的计算,然后把结果在入栈,直到整个表达式结束,这时送入栈顶的值就是结果。

5、程序清单

#include<

stdio.h>

malloc.h>

conio.h>

#definemaxsize100typedefdoubledatatype1;

typedefstructstack1{

/*栈顶元素*/}seqstack1,*pseqstack1;

/*顺序栈*/typedefstructstack2

/*栈顶元素*/}seqstack2,*pseqstack2;

/*顺序栈*//*栈的初始化*/pseqstack1init_seqstack1(void){

pseqstack1S;

S=(pseqstack1)malloc(sizeof(pseqstack1));

if(S)

S->

top1=-1;

returnS;

}

pseqstack2init_seqstack2(void)

pseqstack2S;

S=(pseqstack2)malloc(sizeof(pseqstack2));

top2=-1;

/*判断栈空*/

intempty_seqstack1(pseqstack1S)

if(S->

top1==-1)

return1;

else

return0;

intempty_seqstack2(pseqstack2S)

top2==-1)

/*X入栈*/

intpush_seqstack1(pseqstack1S,datatype1X){

top1==maxsize-1)

printf("

栈满,无法入栈!

\n"

);

return0;

top1++;

data1[S->

top1]=X;

return1;

intpush_seqstack2(pseqstack2S,datatype2X)

top2==maxsize-1)

top2++;

data2[S->

top2]=X;

/*X出栈*/

intpop_seqstack1(pseqstack1S,datatype1*X)

if(empty_seqstack1(S))

*X=S->

top1];

top1--;

intpop_seqstack2(pseqstack2S,datatype2*X)

{if(empty_seqstack2(S))return0;

{*X=S->

top2];

S->

top2--;

/*求栈顶元素*/

intgettop_seqstack1(pseqstack1S,datatype1*X)

{if(empty_seqstack1(S))return0;

else*X=S->

intgettop_seqstack2(pseqstack2S,datatype2*X)

/*判断字符是否为操作数。

若是返回1,否则返回0*/

intisnum(charc)

if(c>

='

&

&

c<

9'

)return1;

elsereturn0;

/*求后缀表达式的值*/doublepostfix_exp(char*A)

{pseqstack1S;

/*定义栈S*/doubleoperand=0;

doubleresult;

/*存放栈顶元素*/

doublea;

/*运算符ch前的操作数出栈存入a*/doubleb;

/*运算符ch后的操作数出栈存入b*/

doublec;

/*c==achb*/

charch;

/*存放读取到的表达式(A)的字符*/ch=*A++;

/*读表达式字符=>

A*/

S=init_seqstack1();

/*初始化栈*/while(ch!

#'

)/*遇到元素!

时*/

if(isnum(ch))/*判断ch是否为数字字符,计算出操作数*/operand=operand*10+(ch-'

else/*否则*/

if(operand)

push_seqstack1(S,operand);

/*当前字符不是数字,操作数结束,要入栈*/operand=0;

if(ch!

ch!

'

pop_seqstack1(S,&

b);

/*运算符ch后的操作数出栈存入b*/

a);

/*运算符ch前的操作数出栈存入a*/

switch(ch)/*求achb==?

将结果赋给c*/

case'

+'

:

c=a+b;

break;

-'

c=a-b;

break;

*'

c=a*b;

/'

if(b!

=0)

c=a/b;

elseprintf("

分母为零!

"

push_seqstack1(S,c);

/*将c压入栈中*/

ch=*A++;

/*指针向下移动一位*/

}/*遇到'

循环结束*/

gettop_seqstack1(S,&

result);

/*此时栈顶元素即为计算结果result*/

returnresult;

/*优先级判断函数*/intpriority(charop)

switch(op)

:

)'

return2;

return3;

return4;

('

return5;

default:

/*将指针infixexp指向的中缀表达式转换为指针postfixexp指向的后缀表达式*/intinfix_exp_value(char*infixexp,char*postfixexp)

/*定义栈S*/

intcount=0;

charw;

/*存放读取到的表达式(infixexp)的字符*/

charc;

chartopelement;

/*存出栈元素*/

S=init_seqstack2();

/*初始化栈*/

if(!

S)/*栈的初始化判断*/

栈初始化失败!

push_seqstack2(S,'

/*将结束符'

#'

加入运算符栈S中*/

w=*infixexp;

w*

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

当前位置:首页 > 初中教育 > 科学

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

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