大数阶乘数据结构算法课程设计Word文件下载.docx
《大数阶乘数据结构算法课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《大数阶乘数据结构算法课程设计Word文件下载.docx(54页珍藏版)》请在冰豆网上搜索。
ChainNode<
*link;
};
classChain
{
public:
Chain(){first=0;
~Chain();
boolIsEmpty()const{returnfirst==0;
}intLength()const;
boolFind(intk,T&
x);
Chain<
&
Insert(intk,constT&
x);
Change(intk,Tx);
Delete(intk,T&
Search(constT&
x)const;
intOutPut();
*first;
//析构函数(删除链表的所有节点)template<
:
~Chain()
*next;
while(first)
{next=first->
link;
deletefirst;
first=next;
}
//确定链表的长度template<
intChain<
Length()const
*current=first;
intlen=0;
while(current)
len++;
current=current->
returnlen;
//在链表中查找第K个元素template<
boolChain<
Find(intk,T&
x){
intindex=0;
while(index<
k&
current)
index++;
if(current){x=current->
data;
returntrue;
}returnfalse;
//向链表中插入元素
Chain<
*p=first;
for(intindex=1;
index<
p;
index++)p=p->
*y=newChainNode<
y->
data=x;
if(k){
y->
link=p->
p->
link=y;
else{
link=first;
first=y;
return*this;
//改变链表第k个元素的值template<
Change(intk,Tx)
*p=first;
for(intindex=0;
p&
k;
index++)
{p=p->
if(p)
//删除链表第k个元素template<
Delete(intk,T&
if(k=0){first=first->
}else
*p=first;
*q=first;
k-1&
q;
q=q->
p=q->
q-link=p->
x=P->
deletep;
return*this;
//搜索第k个元素template<
Search(constT&
x)const{
*current=first;
intindex=1;
while(current&
current->
data!
=x)
current=current->
index++;
if(current)returnindex;
return0;
//倒序输出链表template<
OutPut()
int*arry=newint[len];
current=first;
{arry[index]=current->
current=current->
index++;
index=index-1;
cout<
<
arry[index];
for(index;
index>
=0;
index--)
cout.fill('
0'
);
cout.width(3);
endl;
return0;
intmain()
int>
A;
intn,i,j,k;
intl=0;
A.Insert(0,1);
"
pleaseenteranumber:
cin>
>
n;
for(i=1;
i<
=n;
i++)
intm=A.Length();
for(j=0;
j<
m;
j++)
A.Find(j,k);
k=i*k;
A.Change(j,k);
if(k>
=1000)
if(j<
m-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;
Length="
A.Length()<
cout<
阶乘为:
"
A.OutPut();
测试数据】
(1)n=20,n!
=2432902008176640000
(2)n=30,n!
=265252859812191058636308480000000
【运行结果】
pleaseenteranumber:
20
Length=7;
阶乘为:
2432902008176640000
实习题目二
算术表达式求值
【问题描述】对一个合法的中缀表达式求值。
假设表达式只包含+、-、*、/四个双目运算符,并且允许有括号出现,运算符本身不具有二义性。
例如:
3.5*(7+2)/(-6)
(1)正确解释表达式;
(2)符合四则运算规则:
先乘除、后加减
从左到右运算
先括号内,后括号外
(3)输出最后的计算结果
【实现关键】
两个栈的使用
两位数以上、负数、小数点?
【实现方式】
基本:
控制台程序
(1)使用两个工作栈:
一个栈OPTR存放运算符;
stack<
char>
另一个栈OPND存放操作数;
double>
(2)运算符之间的优先关系
可用二维数组(算符优先顺序如下:
)
+
-
*
/
(
)
#
=
【实现代码】
#include"
#include<
usingnamespacestd;
templatevclassT>
classStack
Stack(intMaxStackSize=10);
~Stack(){delete[]stack;
}boollsEmpty()const{returntop==-1;
}boolIsFull()const{returntop==MaxTop;
}TTop()const;
StackvT>
Add(constT&
Delete(T&
inttop;
intMaxTop;
T*stack;
template<
Stack<
Stack(intMaxStackSixe){
MaxTop=MaxStackSixe-1;
stack=newT[MaxStackSixe];
top=-1;
}template<
TStack<
Top()const
returnstack[top];
Stack<
Add(constT&
stack[++top]=x;
Delete(T&
x)
{x=stack[top--];
}//此函数用来比较两个符号的优先级
intComp(charleft,charright)
chart[9]={'
+'
'
-'
*'
7'
%'
A'
('
)'
#};
intsmax[9][9]=/*+*/{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,/*/*/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};
intj,k;
for(inti=0;
9;
if(left==t[i])
j=i;
if(right==t[i])
k=i;
switch(smax[j][k])
case1:
return1;
case2:
return-1;
case3:
default:
ERROR!
!
return2;
doubleCal(charb,charop,chara)
doubled=(int)b-48;
doublee=(int)a-48;
switch(op)
case'
returnd+e;
//计算+
returnd-e;
//计算-
returnd*e;
//计算*
/'
//计算/if(e==0)
coutvv"
被除数为0,有错!
!
returnfalse;
elsereturnd/e;
charx;
op;
k;
op.Add('
#'
请输入中缀表达式并以#1吉尾"
chars[20];
charexpr[20];
cin.getline(s,20);
cout«
后缀表达式为:
endl;
for(intj=0;
strlen(s);
if(s[j]>
='
s[j]<
9'
s[j];
k.Add(s[j]);
if(s[j]!
if(Comp(op.Top(),s[j])==-1)op.Add(s[j]);
elseif(Comp(op.Top(),s[j])==1){
op.Top();
k.Add(op.Top());
op.Delete(x);
op.Add(s[j]);
if(s[j]=='
while(op.Top()!
if(op.Top()=='
k.Add(op.Top());
op.Delete(x);
inti=0;
chara;
charb;
doublen;
charm;
while(!
k.IsEmpty())
k.Delete(expr[i]);
i++;
for(i=i-1;
i>
i--)
if(expr[i]>
expr[i]<
)k.Add(expr[i]);
k.Delete(a);
k.Delete(b);
n=Cal(b,expr[i],a);
m=n+'
k.Add(m);
表达式的值为:
(double)k.Top()-48<
【运行结果】请输入中缀表达式并以#结尾(4+2)/3-4*3
后缀表达式为:
42+3/43*-表达式的值为:
-10
实习题目三
二叉树基本算法的实现
【功能要求】
实现Create方法,要求键盘输入二叉树结点序列,创建一棵二叉树(提示:
前序递归)
实现SwapTree方法,以根结点为参数,交换每个结点的左子树和右子树(提示:
前序递归)
增加InorderTree方法,采用非递归方法实现二叉树的中序遍历你可以选择:
对BinaryTree模板进行功能扩充;
自己定义并实现二叉树类要求键盘输入二叉树结点序列结点序列可以是前序,也可以是层次空结点以#表示
【代码实现】
//二叉树01.cpp:
Definestheentrypointfortheconsoleapplication.
//
template<
classBinaryTreeNode;
classBinaryTree
BinaryTree()
root=0;
BinaryTree(constBinaryTree<
&
Tree)
copy(Tree.root,root);
~BinaryTree(){};
boolIsEmpty()const
return((root)?
false:
true);
voidCreat();
boolRoot(T&
voidMakeTree(constT&
element,BinaryTree<
left,BinaryTree<
right);
voidBreakTree(T&
voidPreOrder(void(*Visit)(BinaryTreeNode<
*u))
PreOrder(Visit,root);
voidInOrder(void(*Visit)(BinaryTreeNode<
InOrder(Visit,root);
voidPostOrder(void(*Visit)(BinaryTreeNode<
PostOrder(Visit,root);
voidLevelOrder(void(*Visit)(BinaryTreeNode<
*u));
voidPreOutput()
PreOrder(Output,root);
voidInOutput()
InOrder(Output,root);
voidPostput()
PostOrder(Output,root);
voidLevelOutPut()
LevelOrder(Output);
voidDelete()
PostOrder(Free,root);
intHeight()const
returnHeight(root);
intSize()const
returnSize(root);
BinaryTreeNode<
*iCreat();
boolequal(BinaryTree<
Tree)
returncompare(root,Tree.root);
voidswap()
{swap(root);
intleave()
returnleave(root);
intnoleave()
returnnoleave(root);
*root;
voidPreOrder(void(*Visit)(BinaryTreeNode<
*u),BinaryTreeNode<
*t);
voidInOrder(void(*Visit)(BinaryTreeNode<
voidPostOrder(void(*Visit)(BinaryTreeNode<
staticvoidOutput(BinaryTreeNode<
*t)
{cout<
t->
data<
staticvoidFree(BinaryTreeNode<
*t)
deletet;
intHeight(BinaryTreeNode<
*t)const;
intSize(BinaryTreeNode<
boolcompare(BinaryTreeNode<
*t1,BinaryTreeNode<
*t2);
voidcopy(constBinaryTreeNode<
*&
t2);
voidswap(BinaryTreeNode<
intleave(BinaryTreeNode<
intnoleave(BinaryTreeNode<
classLinkedQueue;
classNode{
friendLinkedQueue<
private:
Node<
*link;
classLinkedQueue
{public:
LinkedQueue()
{front=rear=0;
~LinkedQueue();
boolIsEmpty()const
return((front)?
boolIsFull()const;
TFirst()const;
TLast()const;
LinkedQueue<
Add(constT&
*front;
Node