平衡二叉树和栈的运用.docx
- 文档编号:28812512
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:34
- 大小:148.61KB
平衡二叉树和栈的运用.docx
《平衡二叉树和栈的运用.docx》由会员分享,可在线阅读,更多相关《平衡二叉树和栈的运用.docx(34页珍藏版)》请在冰豆网上搜索。
平衡二叉树和栈的运用
数学与计算机学院
课程设计说明书
课程名称:
数据结构与算法A设计实践
课程代码:
6015059
题目一:
栈的应用1
题目二:
二叉排序树的实现
年级/专业/班:
某年某月
学生姓名:
某某人
学 号:
开始时间:
X年X月X日
完成时间:
X年X月X日
课程设计成绩:
学习态度及平时成绩(30)
技术水平与实际能力(20)
创新(5)
说明书撰写质量(45)
总分(100)
指导教师签名:
年月
目录
摘要-1-
1引言-2-
1.1任务与分析-2-
2题目一的设计方案-2-
2.1整体设计方案-2-
2.2程序代码的编写与详细介绍-2-
2.3程序演示-11-
3.题目二的设计方案-12-
3.1整体设计方案-13-
3.2程序代码的编写与详细介绍-13-
3.3程序演示-19-
结论-22-
致谢-23-
参考文献-24-
摘要
数据结构是计算机存储、组织数据的方式。
是指相互之间存在一种或多种特定关系的数据元素的集合。
树型结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。
关键词:
数据结构,栈,顺序存储,链式存储,二叉排序树
1引言
1.1任务与分析
题目一:
栈的应用1
本题目的主要内容是实现了栈结构的基本操作。
具体要求是:
(1)假设一死胡同仅能容一辆汽车进入,使用顺序栈模拟汽车进入和退出的动态过程;
(2)使用链栈模拟以上问题;
(3)验证用户输入的表达式是否符合数学意义上的括号匹配(常用的括号有((),[]{});
题目二:
二叉排序树的实现
本题目的主要内容是实现了栈结构的基本操作。
具体要求是:
(1)用顺序和二叉链表作存储结构,输入数列L,以回车('\n')为输入结束标志生成一棵二叉排序树T;
(2)对二叉排序树T作中序和先序遍历,输出结果;
(3)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,否则输出信息“无x”
2题目一的设计方案
2.1整体设计方案
建栈车辆进站车辆出战
2.2程序代码的编写与详细介绍
//用链栈模拟汽车进栈出栈
//byhf2014.5.31
#include
#include
#include
#defineTRUE1
#defineFALSE0
#defineNULL0
typedefintElementType;
typedefstructnode//链栈结构体
{
ElementTypedata;
structnode*next;
}StackNode,*LinkStack;
typedefstructstack//顺序栈的定义;
{
inta[100];
inttop;
}Sqstack;
voidInitStack(LinkStacktop);
intIsEmpty(LinkStacktop);
intPush(LinkStacktop,ElementTypeelement);
intPop(LinkStacktop,ElementType*element);
Sqstack*InitStack1()//顺序栈的初始化;
{
Sqstack*ret=NULL;
ret=(Sqstack*)malloc(sizeof(Sqstack));
if(ret)
{ret->top=0;}
returnret;
}
voidInitStack(LinkStacktop)//栈顶元素初始化
{
top->next=NULL;
}
intIsEmpty(LinkStacktop)//判断栈顶元素是否为空
{
if(top->next==NULL)
{
returnTRUE;
}
else
{
returnFALSE;
}
}
intPush1(Sqstack*stack,intdata)//进栈函数
{
stack->a[stack->top]=data;
stack->top++;
return1;
}
intPop1(Sqstack*stack,intdata)//出栈函数
{
if(stack->top==0)
{
puts("站内已经没有车了!
");
}
else
{
data=stack->a[stack->top];
stack->top--;
}
return1;
}
intPush(LinkStacktop,ElementTypeelement)//车辆进站
{
StackNode*temp;
temp=(StackNode*)malloc(sizeof(StackNode));
if(temp==NULL)
{
printf("\n我们车库太小了,不好意思你请到别处停车区吧...");
returnFALSE;
}
temp->data=element;
temp->next=top->next;
top->next=temp;
returnTRUE;
}
intPop(LinkStacktop,ElementType*element)//车辆出栈
{
if(IsEmpty(top)){
returnFALSE;
}
StackNode*temp=top->next;
*element=temp->data;
top->next=temp->next;
free(temp);
returnTRUE;
}
voidOrderstack()
{
Sqstack*qq=InitStack1();
puts("请输入要进站的车辆数:
\n");
intnum=0;
scanf("%d",&num);
for(intk=0;k { intt=Push1(qq,k); if(t==1) { printf("第%d辆车进栈! \n",k+1); Sleep(2000); } else { printf("第%d辆车出状况了..."); getchar(); continue; } } intflag=0; FF: puts("\n是否让车辆出站(Y/N)? "); fflush(stdin); chara; a=getchar(); if(a=='n'||a=='N') { puts("请按任意键结束..."); return; } elseif(a=='y'||a=='Y') { for(intda=num;da>0;da--)//车辆出站循环 { if(Pop1(qq,da)==1) { printf("第%d辆车出站了! \n",da); Sleep(2000); } else { puts("出站混乱,造成交通事故,请按任意键退出..."); getchar(); exit(0); } } } else { if(flag>=5) { puts("你实在是太犹豫了,我们下班了! 请按任意键退出..."); printf("%d",flag); fflush(stdin); getchar(); return; } else{ flag++; gotoFF; } } system("pause"); } voidLinkstack() { LinkStackss; ss=(LinkStack)malloc(sizeof(StackNode)); InitStack(ss); puts("请输入要进站的车辆数: \n"); intm=0; scanf("%d",&m); if(m>0) { for(inti=0;i { if(Push(ss,i)==1) { printf("\n第%d辆车已经进站! \n",i+1); Sleep(1000*2); } else { printf("\n第%d辆车好像违规了不能进站,请按任意键退出...",i+1); getchar(); exit(0); } } } puts("\n所有车已经进站了哟...\n"); Sleep(2000); intflag=0; KK: puts("\n是否让车辆出站(Y/N)? "); fflush(stdin); chara; a=getchar(); if(a=='n'||a=='N') { puts("请按任意键结束..."); exit(0); } elseif(a=='y'||a=='Y') { for(intj=0;j { if(Push(ss,j)==1) { printf("\n第%d辆车已经出站...\n",m-j); Sleep(2000); } else { puts("\n出站混乱,造成交通事故,请按任意键退出..."); getchar(); exit(0); } } puts("\n车辆已经全部出站了,请按任意键退出..."); fflush(stdin); getchar(); return; } else { if(flag>=5) { puts("你实在是太犹豫了,我们下班了! 请按任意键退出..."); printf("%d",flag); fflush(stdin); getchar(); return; } else{ flag++; gotoKK; } } system("pause"); } intmain() { system("cls"); puts("********************请选择车辆进出栈方式***************************"); puts("********************1.顺序进栈*************************************"); puts("********************2.链式进栈*************************************"); puts("********************3.退出系统*************************************"); intk; puts("请输入你的选择: "); scanf("%d",&k); if(k==1) { Orderstack(); } elseif(k==2) { Linkstack(); } elseif(k==3) { exit(0); } else { main(); } main(); return0; } 表达式符号匹配: //因用的结构是链式存储,就不在重复,主函数的调用如下 //用链栈实现数学表达式括号匹配! //byhf2014.5.31 #include #include #include #defineTRUE1 #defineFALSE0 #defineNULL0 typedefcharElementType; typedefstructnode{ ElementTypedata; structnode*next; }StackNode,*LinkStack; voidInitStack(LinkStacktop){ top->next=NULL; } intIsEmpty(LinkStacktop){ if(top->next==NULL)returnTRUE; returnFALSE; } intPush(LinkStacktop,ElementTypeelement){ StackNode*temp; temp=(StackNode*)malloc(sizeof(StackNode)); if(temp==NULL)returnFALSE; temp->data=element; temp->next=top->next; top->next=temp; returnTRUE; } intPop(LinkStacktop,ElementTypeelement){ if(IsEmpty(top))returnFALSE; StackNode*temp=top->next; element=temp->data; top->next=temp->next; free(temp); returnTRUE; } ElementTypeGetTop(LinkStacktop,ElementTypeelement){ element=top->next->data; returnelement; } intmain() { LinkStacks; s=(LinkStack)malloc(sizeof(StackNode)); InitStack(s); puts("请输入一个数学表达试: \n"); chara[1000]; gets(a); puts("该表达试为: "); puts(a); inti=0; while(a[i]! =NULL) { if(a[i]=='('||a[i]=='{'||a[i]=='['||a[i]=='(') { Push(s,a[i]); printf("括号: ‘%c’正在匹配...\n",a[i]); Sleep(1000); } elseif(a[i]==')'||a[i]=='}'||a[i]==']'||a[i]=='(') { ElementTypem[1]; m[0]=GetTop(s,1); if(a[i]==')'&&m[0]=='(') { Pop(s,a[i]); printf("括号: ‘%c’已经被匹配到...\n",a[i]); Sleep(1000); } elseif(a[i]==')'&&m[0]=='(') { Pop(s,a[i]); printf("括号: ‘%c’已经被匹配到...\n",a[i]); Sleep(1000); } elseif(a[i]==']'&&m[0]=='[') { Pop(s,a[i]); printf("括号: ‘%c’已经被匹配到...\n",a[i]); Sleep(1000); } elseif(a[i]=='}'&&m[0]=='{') { Pop(s,a[i]); printf("括号: ‘%c’已经被匹配到...\n",a[i]); Sleep(1000); } else { printf("括号: ‘%c’不能被被匹配到,表达式出错! ! ! \n",a[i]); Sleep(2000); puts("请按任意键退出..."); getchar(); exit(0); } } i++; } if(IsEmpty(s)==TRUE) { puts("所有括号已经被匹配,表达式正确! "); } else { ElementTypem[1]; m[0]=GetTop(s,1); printf("括号: ‘%c’不能被被匹配到,表达式出错! ! ! \n",m[0]); Sleep(2000); puts("请按任意键退出..."); getchar(); exit(0); } system("pause"); return0; } 2.3程序演示 基于顺序存储和链式存储的栈的操作是一样的,就简单地列举一种方式的运行情况,如图: 根据给出的选择,进行操作 表达式符号的匹配: 3.题目二的设计方案 3.1整体设计方案 此题基本是对于素组的一个存储,并且要求是有序的存储的。 这样在删除的时候需要重点考虑的问题就是如何在删除之后保持还是有序的了。 设计方案如下: 3.2程序代码的编写与详细介绍 /*二叉树链式储存结构 * *byhf2014.6.16 * */ #include #include #include typedefintTElemType; typedefstructBiNode { TElemTypedata; structBiNode*left,*right; }BiNode,*BiTree; BiTreeInitBiTree() { /* *新建一个空节点 *插入第一个元素时为此节点赋值 */ BiTreeHead=(BiTree)malloc(sizeof(BiNode)); if(Head==NULL) { puts("头节点创建失败,请按任意键退出..."); system("pause"); returnNULL; } else { Head->data=NULL; Head->left=NULL; Head->right=NULL; returnHead; } returnHead; } intSearchBST(BiTreeT,intkey)//查找结点 { BiTreep=T; if(p==NULL) return0; if(p->data==key) return1; elseif(p->data>key) returnSearchBST(p->left,key); elseif(p->data returnSearchBST(p->right,key); } BiTreeInsertBST(BiTreeT,intkey)//插入数据 { BiTreeparent,node,child; if(T==NULL||T->data==NULL) { T=(BiTree)malloc(sizeof(BiNode)); T->data=key; T->left=T->right=NULL; returnT; } parent=T; node=T; while(node! =NULL) { if(node->data==key) { returnT; } else { parent=node; if(node->data>key) node=node->left; else node=node->right; } } child=(BiTree)malloc(sizeof(BiNode)); child->data=key; child->left=child->right=NULL; if(key>parent->data) parent->right=child; else parent->left=child; returnT; } voidPreOrderTraverse(BiTreeT)//先序递归遍历 { if(T) { printf("%d\t",T->data); PreOrderTraverse(T->left); PreOrderTraverse(T->right); } } voidMidorderTraverse(BiTreeT)//中序递归遍历 { if(T) { MidorderTraverse(T->left); printf("%d\t",T->data); MidorderTraverse(T->right); } } intDeleteNode(BiTreeT,intkey) { BiTreep,pre=NULL,mid; p=T; if(p==NULL) return0; while(p&&(p->data! =key)) { pre=p; if(p->data p=p->right; else p=p->left; } if(p==NULL) return0; if((p->left==NULL)||(p->right==NULL)) { if(pre->left==p) pre->left=((p->left==NULL)? p->right: p->left); else pre->right=((p->left==NULL)? p->right: p->left); free(p); return1; } else { mid=p->right; pre=p; while(mid->left! =NULL) { pre=mid; mid=mid-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 平衡 二叉 运用