




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、线性结构数据结构什么是数据结构? 数据结构(Data Structure),用于描述计算机中数据的存储、组织形式。合理的数据结构可以给程序带来更高的存储和运行效率。常用的数据结构有哪些?1.线性结构2.树型结构3.图型结构栈、队列、链表栈 栈(stack)是一种特殊的线性结构,它只能在一端进行插入和删除操作。 能插入和删除的一端栈顶(top),另一端称为栈底 (bottom)。 不含任何元素的栈称为空栈。 只允许在栈顶进行插入和删除,所以栈的操作是按“后进先出”(Last In First Out)的原则进行的。栈底(bottom)栈顶(top)栈的实例1:汉诺塔栈的实例2:弹夹栈顶(top)
2、装弹、出弹285top(栈顶)用数组模拟栈的“后进先出”加入一个数7取出栈顶元素再取出栈顶元素9bottom(栈底,值为0)数组(栈)123456下标栈为空的条件是:top=bottomtop始终指向栈顶一般情况下,top的值就表示了栈中的元素个数/插入(压栈)void push(char x) if(top=maxn) coutfull; else top+; stacktop=x; /删除(弹栈)void pop() if(top=0) coutempty; else coutstacktop; top-; const int maxn=1000char stackmaxn+1;int t
3、op=0;4321使用栈进行算术表达式求值表达式:3 ( 5 2 ) + 7 数字运算符3(523+975 2 = 33 3 = 97 + 9 = 16结果便是16!16栈的实例2:混合运算考题(初赛) 若S是一个大小为4的栈,若元素1,2,3,4,5,6,7按顺序依次进栈,则这7个元素的出栈顺序可能为( ) A.1,2,3,4,5,6,7 B.1,4,3,5,7,2,6 C.1,3,2,4,7,5,6 D.2,3,7,6,5,4,1 栈的实例3:火车调度(NKOJ 1914) 某城市有一个火车站,如下图 所示,现有 n(n =10000)节火车车厢,顺序编号为 1,2,3,.,n,按编号连续
4、依次从 A 方向的铁轨驶入车站,从 B 方向铁轨驶出。一旦车厢进入车站就不能再回到 A 方向的铁轨上;在车站的门口有工人可以将车厢拖出车站,工人一次只能拖一节车厢,并且只能将车厢拖入B方向的铁轨。一旦车厢出了车站就不能再回到车站。车站一开始为空,最多能停放 10000 节车厢。 为了方便装货,调度员需要将车厢从新排列,问能否将车厢编号排列成A1,A2,.,An。也就是使车厢从B方向驶出的编号是A1,A2,.,An。如果能输出yes,否则输出no。输入格式:第一行,一个整数n第二行,n个用空格间隔的整数,表示出站时车厢编号要排列成的顺序A1,A2,.,An输出格式:一行,一个单词yes或者no样
5、例输入1:53 2 5 4 1样例输出1:yes样例输入2:53 1 5 4 2样例输出2:no车站AB驶入驶出/将题目要求的出站序列读入a数组,然后通过栈从左到右依次去匹配a数组#include #include using namespace std;int s10001,a10001,n,i,j,top=0; /s数组用于模拟栈int main() scanf(%d,&n); for(i=1;i=n;i+)scanf(%d,&ai); i=j=1; while(i0)top-;j+; i+; /讨论下一辆车 /如果栈不为空,表示有编号无法匹配 if(top=0)printf(yesn);
6、 else printf(non); return 0;队列 队列(queue)是另一种特殊的线性表,它的特点是删除操作在一头进行,插入操作在另一头进行。 允许删除的一端称为队首(head),允许插入的一端称为队尾(tail)。 不含任何元素的队称为空队。 队列的修改是按先进先出(First In First Out)的原则进行队首(head)队尾(tail)用数组模拟队列的“先进先出”C12345678数组(队列)数组下标head(队首)tail(队尾)FXM1. 插入数据:2. 插入数据:3. 插入数据:4. 删除数据4. 删除数据5. 插入数据:当head=tail时表示队列为空head
7、指向队首tail指向下一个空位在队首进行删除在队尾进行插入队列的代码实现#define maxn 101char queuemaxn;int head,tail;/入队(插入元素)void insert(char x) if(tailmaxn) coutfull; else queuetail=x; tail+; /出队(删除元素)void del( ) if(tail=head) coutempty; else coutqueuehead; head+; 试题(初赛)设栈S和队列Q初始状态为空,元素e 1 ,e 2 ,e 3 ,e 4 ,e 5 ,e 6依次通过栈S,一个元素出栈后即进入队列
8、Q,若出队的顺序为e 2 ,e 4 ,e 3 ,e 6 ,e 5 ,e 1 ,则栈S的容量至少应该为( ).A)2 B)3 C)4 D)5例:纸牌游戏(NKOJ1917) 桌上有一叠纸牌,共n张牌。从位于顶端的纸牌开始从上往下依次编号为1到n。现在反复进行以下操作:把位于顶端的牌扔到,然后把新的位于顶端的牌放到整叠牌的底部。直到只剩下一张牌。输入n(n; for(i=1;i=n;i+)qi=i; /队列赋初值 head=1; /队首指针指向位于顶端的牌的位置 tail=n+1; /对尾指针指向下一个空位 while(headtail) /如果队列不为空 printf(%d ,qhead); /
9、输出队首,即扔到最顶端的牌 head+ /队首指针指向新的位于顶端的牌 qtail=qhead; /将位于最顶端的牌移到队尾 tail+; /对尾指针指向下一个可用空位 head+; /队首指针指向新的位于顶端的牌 return 0; 链表甲乙丙丁戊左:无右:甲左:丙右:戊左:甲右:乙左:戊右:丁左:乙右:无 链表(list),由多个结点连接而成的链状结构。每个结点包含两部分,数值和存放结点间的相互关系 右图中,每个人看做一个节点,数值就是每个人自己的名字。同时记录下左边是谁,右边是谁,这就是节点间的关系。061423152380 链表(list),由多个结点连接而成的链状结构。每个结点包含两
10、部分,数值和存放结点间的相互关系。编号1编号2编号3编号4双向链表:12113315222 0编号1编号2编号3编号4单向链表:左A右DBC在1和2间插入4号点D1.让4的左手牵2的左手牵的对象 list4.left=list2.left;2.让4的右手牵1的右手牵的对象 list4.right=list1.right3.让1的右手放开2,然后牵4 list1.right=4;4.让2的左手放开1,然后牵4 list2.left=4;删除 B1.让4的右手牵2的右手牵的对象 list4.right=list2.right;2.让3的左手牵2的左手牵的对象 list3.left=list2.le
11、ft;3.让2的右手放开 list2.right=0;4.让2的左手放开 list2.left=0;struct node char name; int left,right; ;node list10;123list1.right=2;list1.left=0;list2.right=3;list2.left=1;list3.right=0;list3.left=2;4head链表的 代码实现node list100;/把编号x的元素插到p号点之后void insert(int p,int x) listx.right=listp.right; listx.left=p; listlistp
12、.right.left=x; listp.right=x;/删除编号为x的结点void del(int x) int p,q; if(head=x) head=listx.left; p=listx.left; q=listx.right; listp.right=listx.right; listq.left=listx.left; listx.left=0; listx.right=0; /查找链表中的名为helang的结点的编号void searchList(string s) int p; p=head; while(p!=0) & (!=helang)p=list
13、p.right; if(=helang) coutp; else coutnot found;struct node char name; int left,right; ; 17世纪的法国数学家加斯帕在数目的游戏问题中讲了这样一个故事:25个基督教徒和25 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:50个人围坐成一圆圈,从第一个人开始顺时针依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余25个人为止。问怎样排座位,才能使每次投入大海的都是非教徒。 struct people /right为上一个人的编号 int le
14、ft,right; /left为下一个人的编号 bool dead; /如果dead为true表示要被扔下海;people ren51;int i,n,p,x,y;int main() for(i=1;i25) for(i=1;i=9;i+) p=renp.left; x=renp.right; y=renp.left; renx.left=y; reny.right=x; renp.dead=true; n-; for(i=1;i=50;i+) if(reni.dead=false)couti ; coutendl; return 0;123要删除2号节点leftleftrightright
15、rightleftxy课后练习:1085网页浏览 NKOJ 1085 网页浏览器都包含有前进和后退功能,以此来快速打开之前你访问过的网页。你的任务就是实现这个功能。实现此功能的常用方法是通过forword和back两个栈来保存前进和后退时要打开的网页。下列命令是你需要实现的:BACK: 把当前显示的网页压入到forword栈中。然后把back栈栈顶的网页弹出作为当前显示的网页。如果back栈为空,那么这条命令就不执行。FORWARD: 把当前显示的网页压入到back栈中。然后把forward栈栈顶的网页弹出作为当前显示的网页。如果forward栈为空,那么这条命令就不执行。VISIT : 把当
16、前显示的网页压入到back栈中。然后浏览器显示用户新输入的网址对应的网页。清空forward栈QUIT: 关闭浏览器假设只要浏览器一打开就会自动打开网页/ 输入格式:包含若干条命令,这些命令由BACK,FORWARD,VISIT和QUIT构成。每条命令占一行,长度不超过70。命令的总条数不超过100。一旦出现QUIT表示结束输入命令。输出格式:对于每个命令,如果它不是QUIT,那么输出命令执行后浏览器显示的网页。如果该命令无法执行,则输出 Ignored,除QUIT命令外,每一个输入命令对应一行输出结果。样例输入VISIT /VISIT /acmicpc/BACKBACKBACKFORWARD
17、VISIT /BACKBACKFORWARDFORWARDFORWARDQUIT样例输出/acmicpc/Ignored/Ignored何老板倾情翻译#define maxn 101string fwdmaxn,bakmaxn,now,cmd;int fTop=0,bTop=0;int main() now=/; /打开浏览器会自动登录到 getline(cin,cmd); /输入的命令中可能包含空格,所以用getline()读入 while(cmd!=QUIT) if(cmd=BACK) if(bTop!=0) /back栈不为空则执行BACK命令 fTop+; fwdfTop=now; /
18、把当前显示的网页加入forword栈栈顶 now=bakbTop; bTop-; /弹出back栈栈顶网页作为当前要显示的网页 coutnowendl; else coutIgnoredendl; else if(cmd=FORWARD) if(fTop!=0) bTop+; bakbTop=now; now=fwdfTop; fTop-; coutnowendl; else coutIgnoredendl; else /用户新输入了一个网址 bTop+; bakbTop=now; /把当前网页压入到back栈中 now=cmd; /now为当前要显示的网页 now.erase(0,6); /去掉命令前的VISIT fTop=0; /清空forward栈 coutnowendl; getline(cin,cmd); return 0;链表的实现一般采用 结构体struct类型输入n(=100)个学生,每个学生有姓名,性别,语文数学成绩,请按语文数学成绩总分的由高到低顺序打印出每个学生的信息。样例输入:3tom f 99 88jim m 67.5 77.5alex m 85.5 90样例输出:tom f 99 88alex m 85.5 90
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学生廉政教育课件
- 沙水区大城堡课程故事
- 中国民居建筑艺术赏析
- 2025年山东省工艺品出口合同
- 2025装修工劳动合同样本
- 2025年华南农行柜员劳动合同及劳务派遣面试
- 2025搅拌机租赁合同书范文租赁合同
- 2025合同管理与招投标实践题目
- 液压与气动技术课程设计
- 2024-2025湘科版科学一年级下册期中测试卷附答案
- 河流专题复习-重点课件
- 企业风险管理-战略与绩效整合(中文版)
- 2022年全国职工书屋推荐书目
- 哈萨克斯坦铁路车站代码
- 装配式建筑设计设计专篇
- 《教育心理学》教材
- 绥满公路大庆黄牛场至齐齐哈尔宛屯段扩建项目B4合同段施工组织设计
- 身体红绿灯课件
- Pentacam白内障应用(第二版)
- 抗精神病药物的选择与联合应用
- JJF1059.1测量不确定度评定与表示(培训讲稿)
评论
0/150
提交评论