大数阶乘数据结构算法课程设计Word文件下载.docx

上传人:b****5 文档编号:18527977 上传时间:2022-12-19 格式:DOCX 页数:54 大小:129.89KB
下载 相关 举报
大数阶乘数据结构算法课程设计Word文件下载.docx_第1页
第1页 / 共54页
大数阶乘数据结构算法课程设计Word文件下载.docx_第2页
第2页 / 共54页
大数阶乘数据结构算法课程设计Word文件下载.docx_第3页
第3页 / 共54页
大数阶乘数据结构算法课程设计Word文件下载.docx_第4页
第4页 / 共54页
大数阶乘数据结构算法课程设计Word文件下载.docx_第5页
第5页 / 共54页
点击查看更多>>
下载资源
资源描述

大数阶乘数据结构算法课程设计Word文件下载.docx

《大数阶乘数据结构算法课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《大数阶乘数据结构算法课程设计Word文件下载.docx(54页珍藏版)》请在冰豆网上搜索。

大数阶乘数据结构算法课程设计Word文件下载.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 自然景观

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

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