数据结构模拟计算器课程设计Word文件下载.docx
《数据结构模拟计算器课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构模拟计算器课程设计Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
栈来进出运算的数字将后缀表达式的值求出即可。
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*