《数据结构和算法设计》实验2文档格式.docx
- 文档编号:21706838
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:15
- 大小:39.99KB
《数据结构和算法设计》实验2文档格式.docx
《《数据结构和算法设计》实验2文档格式.docx》由会员分享,可在线阅读,更多相关《《数据结构和算法设计》实验2文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
-48
三、程序设计
概要设计
1、宏定义
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
2、基本函数:
(1)voidInitStack_char(SqStack*S)//char型栈初始化
(2)voidInitStack_int(sqStack*S)//int型栈初始化
(3)voidPush_char(SqStack*S,charch)//char型元素进栈
(4)voidPush_int(sqStack*S,intnum)//int型元素进栈
(5)charGetTop_char(SqStack*S)//取char型栈顶元素
(6)intGetTop_int(sqStack*S)//取int型栈顶元素
(7)StatusIn(charc)//判断是否为运算符,若是运算符则返回,否则返回
(8)charPrecede(chara,charb)//判断两运算符的先后次序
(9)StatusPop_char(SqStack*S,char&
x)//char型栈出栈
(10)StatusPop_int(sqStack*S,int&
x)//int型栈出栈
(11)intOperate(inta,chartheta,intb)//计算a和b运算结果
3、流程图
详细设计
数据类型
typedefstructnode//构造char型栈
{
charch;
structnode*next;
}node;
typedefstruct
structnode*base;
structnode*top;
}SqStack;
typedefstructlnode//构造int型栈
intnum;
structlnode*next;
}lnode;
structlnode*base;
structlnode*top;
}sqStack;
操作部分
voidInitStack_char(SqStack*S)
S->
base=(node*)malloc(sizeof(node));
base->
next=NULL;
top=S->
base;
}//char型栈初始化
voidInitStack_int(sqStack*S)
base=(lnode*)malloc(sizeof(lnode));
}//int型栈初始化
voidPush_char(SqStack*S,charch)
node*p;
p=(node*)malloc(sizeof(node));
p->
ch=ch;
next=S->
top;
top=p;
}//char型元素进栈
StatusPush_int(sqStack*S,intnum)
lnode*p;
p=(lnode*)malloc(sizeof(lnode));
num=num;
returnOK;
}//int型元素进栈
charGetTop_char(SqStack*S)
return(S->
top->
ch);
}//取char型栈顶元素
intGetTop_int(sqStack*S)
num);
}//取int型栈顶元素
StatusPop_char(SqStack*S,char&
x)
if(S->
base==S->
top)
returnERROR;
p=S->
x=p->
ch;
top=p->
next;
free(p);
}//char型栈出栈
StatusPop_int(sqStack*S,int&
num;
}//int型栈出栈
计算功能
intOperate(inta,chartheta,intb)
inti,z=1;
switch(theta)
{
case'
+'
:
z=(a+b);
break;
-'
z=(a-b);
*'
z=(a*b);
/'
z=(a/b);
^'
for(i=1;
i<
=b;
i++)
z=z*a;
break;
}
return(z);
}//计算a和b运算结果
StatusIn(charc)
if(c=='
||c=='
('
)'
='
)
returnOK;
else
}//判断是否为运算符
charPrecede(chara,charb)
if(a=='
||a=='
if(b=='
||b=='
return'
>
'
;
else
<
if(b!
#'
return('
);
}//判断两运算符的先后次序
主函数
intmain()//主函数
charc,x,theta;
inta,b,c1;
//定义变量
SqStackOPTR;
//定义字符栈
sqStackOPNR;
//定义整型栈
InitStack_char(&
OPTR);
//初始化
InitStack_int(&
OPNR);
Push_char(&
OPTR,'
//将字符型栈底设为#
c=getchar();
//从键盘输入得到字符
while(c!
||GetTop_char(&
OPTR)!
)//判定是否执行循环
if(!
In(c))
{
c1=0;
while(!
{
c1=c1*10+c-'
0'
c=getchar();
}
Push_int(&
OPNR,c1);
}//当扫描字符不是运算符时,转化为整型数存入栈中
switch(Precede(GetTop_char(&
OPTR),c))//判定运算符的优先关系
case'
Push_char(&
OPTR,c);
c=getchar();
//当前运算符优先级高,存入char栈
Pop_char(&
//运算符次序相等,存入char栈
//当前运算符优先级低
OPTR,theta);
Pop_int(&
OPNR,b);
OPNR,a);
Push_int(&
OPNR,Operate(a,theta,b));
//计算运算结果,并存入int栈
break;
//继续循环
}
printf("
%d\n"
GetTop_int(&
OPNR));
//计算完成,取出int栈顶元素,并输出
return0;
}四、程序调试分析
编写程序的过程中遇到了很多的问题,最突出的两个问题就是整数和两位数的运算处理,一开始修改了主函数部分之后,原来可以执行一位数运算的程序出现了error,由于没有及时保存,并且之前的代码无法恢复,只得重新编写一次。
第二次编写理清思路之后,在课本和网上资料的辅助下,终于成功的编出了程序并且可以完美执行。
经验告诉了我在编程的时候一定要注意经常进行调试,只有学会调试才能处理好大程序的编写,否则极其容易出错。
五、用户使用说明
1.运行程序,
2.将整个表达式从键盘键入,以“=”结束,回车可得到结果。
六、程序运行结果
(1)输入:
(11+3)*5=输出:
70
(2)输入:
(31-13)/(9-3)=输出:
6
七、程序清单
#include<
stdio.h>
stdlib.h>
typedefintStatus;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构和算法设计 数据结构 算法 设计 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)