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