ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:102.68KB ,
资源ID:4705634      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4705634.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(大数阶乘数据结构算法课程设计副本.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

大数阶乘数据结构算法课程设计副本.docx

1、大数阶乘数据结构算法课程设计 副本实习题目一线性表及其应用【问题描述】 大数运算计算n的阶乘(n=20)。【基本要求】(1)数据的表示和存储; (1.1) 累积运算的中间结果和最终的计算结果的数据类型要求是整型这是问题本身的要求; (1.2) 试设计合适的存储结构,要求每个元素或节点最多存储数据的3位数值。 (2)数据的操作及其实现: 基于设计的存储结构实现乘法操作,要求从键盘上输入n值,在屏幕上显示最终计算结果。【实现提示】(1)设计数据的存储结构: 介于阶乘运算的精确性以及实型数据表示的不精确性,本题不能采用实型表示累积运算的中间结果和最终的计算结果,而只能用整型。然而由于普通整型和长整型

2、所能表述数的范围受其字长的限制,不能表示大数阶乘的累积结果,故必须设计一个合适的数据结构实现对数据的存储,例如可以让每个元素或节点存储数据的若干位数值。 从问题描述不难看出n值为任意值,故为使程序尽量不受限制,应采用动态存储结构。(2) 数据的操作及其实现: (2.1)累积运算的特点是当前的计算结果是下次乘法运算的乘数; (2.2)实现两个数的乘法运算须考虑: (1)乘数的各位数都要与被乘数进行乘法运算; (2)乘法过程中的进位问题及其实现; (3)因每个元素或节点最多存储数据的3位数值,故当元素或节点中的数值大于999,需向前一个元素或节点进位。 【实现结构】(1)采用链式存储结构实现(普通

3、单链表,循环单链表,普通双项链表和双向循环链表中任选一种结构)。 (2)采用动态数组实现。【实现程序】#include stdafx.h#include using namespace std;template class Chain;templateclass ChainNode friend Chain;private: T data; ChainNode *link;templateclass Chainpublic: Chain()first=0; Chain(); bool IsEmpty()constreturn first=0; int Length()const; bool F

4、ind(int k,T&x) ; Chain&Insert(int k,const T&x); Chain& Change(int k,T x); Chain& Delete(int k, T &x); Chain& Search(const T&x)const; int OutPut();private: ChainNode*first; ;/*析构函数(删除链表的所有节点)*/template Chain:Chain() ChainNode*next; while(first) next=first-link; delete first; first=next; /*确定链表的长度*/te

5、mplate int Chain:Length()const ChainNode*current=first; int len=0; while(current) len+; current=current-link; return len;/*在链表中查找第K个元素*/template bool Chain:Find(int k,T &x) ChainNode*current=first; int index=0; while(indexlink; index+; if(current) x=current-data;return true; return false;/*向链表中插入元素*

6、/templateChain& Chain:Insert(int k,const T&x) ChainNode*p=first; for(int index=1;indexlink; ChainNode*y=new ChainNode; y-data=x; if(k) y-link=p-link; p-link=y; else y-link=first; first=y; return *this;/*改变链表第k个元素的值*/templateChain& Chain:Change(int k,T x) ChainNode *p=first; for(int index=0;p&indexli

7、nk; if (p) p-data=x; return *this; /*删除链表第k个元素*/templateChain&Chain:Delete(int k, T &x) if(k=0) first=first-link; else ChainNode* p = first; ChainNode* q = first; for(int index=1;indexlink; p=q-link; q-link=p-link; x=P-data; delete p; return *this; /*搜索第k个元素*/templateChain&Chain:Search(const T&x)con

8、st ChainNode *current=first; int index=1; while(current & current-data !=x) current = current-link; index +; if(current)return index; return 0;/*倒序输出链表*/templateint Chain:OutPut() ChainNode*current=first; int index=0; int len=0; while(current) len+; current=current-link; int *arry=new intlen; curren

9、t=first; while(current) arryindex=current-data; current=current-link; index+; index=index-1; cout=0;index-) cout.fill(0); cout.width(3); coutarryindex; coutendl; return 0; int main() Chain A; int n,i,j,k; int l=0; A.Insert(0,1); coutplease enter a number :n; for(i=1;i=n;i+) int m=A.Length(); for(j=0

10、;jm;j+) A.Find(j,k); k=i*k; A.Change(j,k); for(j=0;j=1000) if(jm-1) A.Find(j+1,l); else A.Insert(j+1,0); l=0; l+=k/1000; A.Change(j+1,l); k=k%1000; A.Change(j,k); coutLength = A .Length()endl; cout阶乘为:; A.OutPut(); return 0; 【测试数据】 (1)n20,n!2432902008176640000 (2)n30,n!265252859812191058636308480000

11、000【运行结果】实习题目二算术表达式求值【基本要求】(1)正确解释表达式;(2)符合四则运算规则: 先乘除、后加减 从左到右运算先括号内,后括号外(3)输出最后的计算结果 【实现关键】两个栈的使用两位数以上、负数、小数点?【实现方式】基本:控制台程序【实现提示】(1)使用两个工作栈:一个栈:存放运算符.另一个栈:存放操作数(2)运算符之间的优先关系可用二维数组(算符优先顺序如下:)【实现代码】#include stdafx.h#include using namespace std;templateclass Stack public: Stack(int MaxStackSize=10);

12、 Stack()delete stack; bool IsEmpty()const return top=-1; bool IsFull()constreturn top=MaxTop; T Top()const; Stack&Add(const T &x); Stack&Delete(T&x); private: int top; int MaxTop; T*stack;template Stack:Stack(int MaxStackSixe) MaxTop=MaxStackSixe-1; stack=new TMaxStackSixe; top=-1; templateT Stack:T

13、op()const return stacktop;templateStack&Stack:Add(const T&x) stack+top=x; return *this;templateStack&Stack:Delete(T&x) x=stacktop-; return *this;/此函数用来比较两个符号的优先级int Comp( char left, char right) char t9=+,-,*,/,%,(,),#; int smax99=/*+*/1,1,2,2,2,2,2,1,1, /*-*/ 1,1,2,2,2,2,2,1,1, /*/ 1,1,1,1,1,2,2,1,1

14、, /*/*/ 1,1,1,1,1,2,2,1,1, /*%*/ 1,1,1,1,1,2,2,1,1, /*/ 1,1,1,1,1,1,2,1,1, /*(*/ 2,2,2,2,2,2,2,3,0, /*)*/ 1,1,1,1,1,1,0,1,1, /*#*/ 2,2,2,2,2,2,2,0,3; int j,k; for(int i=0;i9;i+) if(left=ti) j=i; if(right=ti) k=i; switch(smaxjk) case 1:return 1; case 2:return -1; case 3:return 0; default: coutERROR!e

15、ndl; return 2; double Cal(char b, char op, char a) double d=(int)b-48; double e=(int)a-48; switch(op) case +:return d+e; / 计算+ case -:return d-e; / 计算- case *:return d*e; / 计算* case /: / 计算/ if(e=0) cout被除数为0,有错!endl; return false; else return d/e; default: return 0; int main() char x; Stack op; Sta

16、ck k; op.Add(#); cout请输入中缀表达式并以#结尾endl; char s20; char expr20; cin.getline(s,20); cout后缀表达式为:endl; for(int j=0;j=0&sj=9) coutsj; k.Add(sj); else if(sj!=) if(Comp(op.Top(),sj)=-1) op.Add(sj); else if(Comp(op.Top(),sj)=1) coutop.Top(); k.Add(op.Top(); op.Delete(x); op.Add(sj); if(sj=) while(op.Top()!=

17、() coutop.Top(); k.Add(op.Top(); op.Delete(x); if(op.Top()=() op.Delete(x); if(sj=#) op.Delete(x); while(op.Top()!=#) cout=0;i-) if(expri=0&expri=9) k.Add(expri); else k.Delete(a); k.Delete(b); n=Cal(b,expri,a); m=n+0; k.Add(m); cout表达式的值为:endl; cout(double)k.Top()-48endl; return 0;【运行结果】-实习题目三二叉树基本

18、算法的实现【功能要求】实现Create方法,要求键盘输入二叉树结点序列,创建一棵二叉树(提示:前序递归) 实现SwapTree方法,以根结点为参数,交换每个结点的左子树和右子树(提示:前序递归) 增加InorderTree方法,采用非递归方法实现二叉树的中序遍历 你可以选择:对BinaryTree模板进行功能扩充;自己定义并实现二叉树类要求键盘输入二叉树结点序列结点序列可以是前序,也可以是层次空结点以#表示【代码实现】#include stdafx.h#include using namespace std;templateclass BinaryTreeNode;templateclass

19、BinaryTreepublic: BinaryTree() root=0; BinaryTree(const BinaryTree &Tree ) copy(Tree.root,root); BinaryTree(); bool IsEmpty()const return (root)?false:true); void Creat(); bool Root (T&x)const; void MakeTree(const T&element,BinaryTree&left,BinaryTree&right); void BreakTree( T&element,BinaryTree&left

20、,BinaryTree&right); void PreOrder(void (*Visit)(BinaryTreeNode*u) PreOrder(Visit,root); void InOrder(void (*Visit)(BinaryTreeNode*u) InOrder(Visit,root); void PostOrder(void (*Visit)(BinaryTreeNode*u) PostOrder(Visit,root); void LevelOrder(void(*Visit)(BinaryTreeNode*u); void PreOutput() PreOrder(Ou

21、tput,root); coutendl; void InOutput() InOrder(Output,root); coutendl; void Postput() PostOrder(Output,root); coutendl; void LevelOutPut() LevelOrder(Output); coutendl; void Delete() PostOrder(Free,root); root=0; int Height()const return Height(root); int Size()const return Size(root); BinaryTreeNode

22、*iCreat(); bool equal(BinaryTree&Tree) return compare(root,Tree.root); void swap() swap(root); int leave() return leave(root); int noleave() return noleave(root); private: BinaryTreeNode*root; void PreOrder(void(*Visit)(BinaryTreeNode*u),BinaryTreeNode*t); void InOrder(void(*Visit)(BinaryTreeNode*u)

23、,BinaryTreeNode*t); void PostOrder(void(*Visit)(BinaryTreeNode*u),BinaryTreeNode*t); static void Output(BinaryTreeNode* t) coutdata ; static void Free(BinaryTreeNode*t) delete t; int Height(BinaryTreeNode*t)const; int Size(BinaryTreeNode*t)const; bool compare(BinaryTreeNode*t1,BinaryTreeNode*t2); void copy(const BinaryTreeNode*t1,BinaryTreeNode*&t2); void swap(BinaryTr

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

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