第三章 栈和队列_第1页
第三章 栈和队列_第2页
第三章 栈和队列_第3页
第三章 栈和队列_第4页
第三章 栈和队列_第5页
已阅读5页,还剩111页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据结构

——C语言描述青海师范大学计算机学院DATASTRUCTURE

——SpecificationonC4栈的定义1235栈的表示和实现栈的应用队列的定义队列的表示与实现★第三章栈和队列★6队列的应用举例

3.1栈3.1.1栈的定义栈作为一种限定性线性表,是将线性表的插入和删除运算限制为仅在表的一端进行,通常将表中允许进行插入、删除操作的一端称为栈顶(Top),因此栈顶的当前位置是动态变化的,它由一个称为栈顶指针的位置指示器指示。同时表的另一端被称为栈底(Bottom)。当栈中没有元素时称为空栈。栈的插入操作被形象地称为进栈或入栈,删除操作称为出栈或退栈。图3.1栈

ADTStack

数据元素:可以是任意类型的数据,但必须属于同一个数据对象。关系:栈中数据元素之间是线性关系。基本操作:(1)InitStack(S)

操作前提:S为未初始化的栈。操作结果:将S初始化为空栈。(2)ClearStack(S)

操作前提:栈S已经存在。操作结果:将栈S置成空栈。(3)IsEmpty(S)

操作前提:栈S已经存在。操作结果:判栈空函数,若S为空栈,则函数值为TRUE,否则为FALSE。(4)IsFull(S)

操作前提:栈S已经存在。操作结果:判栈满函数,若S栈已满,则函数值为TRUE,否则为FALSE。(5)Push(S,x)

操作前提:栈S已经存在。操作结果:在S的顶部插入(亦称压入)元素x;若S栈未满,将x插入栈顶位置,若栈已满,则返回FALSE,表示操作失败,否则返回TRUE。(6)Pop(S,x)

操作前提:栈S已经存在。操作结果:删除(亦称弹出)栈S的顶部元素,并用x带回该值;若栈为空,返回值为FALSE,表示操作失败,否则返回TRUE。(7)GetTop(S,x)

操作前提:栈S已经存在。操作结果:取栈S的顶部元素。与Pop(S,x)不同之处在于GetTop(S,x)不改变栈顶的位置。3.2栈的表示和实现

1.顺序栈顺序栈是用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时由于栈的操作的特殊性,还必须附设一个位置指针top(栈顶指针)来动态地指示栈顶元素在顺序栈中的位置。通常以top=-1表示空栈。顺序栈的存储结构可以用C语言中的一维数组来表示。栈的顺序存储结构定义如下:#defineTRUE1#defineFALSE0#defineStack-Size50typedefstruct{StackElementTypeelem[Stack-Size];/*用来存放栈中元素的一维数组*/inttop;/*用来存放栈顶元素的下标*/}SeqStack;图3.座2顺序届栈中源的进疫栈和择出栈顺序帮栈基意本操虑作的出实现哪如下:(1痛)初始桃化。vo精idIn商it刑St鞋ac替k(鸣Se索qS针ta会ck*S打){/胖*构造挑一个血空栈S*怪/S-雪>t寇op千=头-1担;逆}(2牙)判栈嫂空。旋in挠tIs冒Em吼pt皱y(队Se咽qS新ta亲ck*S喇)愧/锯*判栈S为空神栈时顺返回慈值为齐真,盘反府之为膊假*/{re慌tu苦rn懂(S制->斥to贤p=冤=-捎1?摆TR球UE颂:F欠AL奴SE谱);摧}(3鄙)判栈小满。边in说tIs际Fu肢ll外(S味eq太St惯ac槽k*S扎){re盘tu填rn总(S死->词to伍p帝==起S谜ta罩ck驶-采Si箭ze茂?T败RU酸E:感FA蚊LS框E)师;}(4遣)进栈甚。in隆tPu牲sh服(S呜eq者St园ac菠k*S长,St护ac要kE费le公me悼nt岩Ty随pex)管{if静(S辜->扒to壤p=恋=端St衡ac缺k土-S童iz头e)魄re庄tu匹rn厦(F怎AL案SE览);拘/俭*栈已糊满*/S-并>t燥op辣++沫;S-益>el民em[S-絮>t浓op]=x混;re傍tu捆rn沉(T滨RU毕E)方;}(5语)出栈毯。异in矛tPo搏p(弦Se丢qS刻ta邻ck*压S,St庭ac辫kE浑le搬me词nt你Ty错pe*x承){禽/讲*将栈S的栈抢顶元泊素弹纸出,吉放佳到x所指玻的存或储空姻间中多*/if李(S汤->驱to竟p=热=-碎1)虹/叠*栈为默空*/re黎tu异rn麻(F墨AL作SE幻玉);伐el勇se注{*x扎=置S-演>el建em[S-讲>t页op];S-滴>t勒op尼--塌;神/*修改仁栈顶剑指针顷*/re邪tu抖rn拜(T悲RU介E)喘;中}}(6贿)取栈遭顶元舞素。妖in孝tGe贴tT拾op(Se适qS中ta鄙ckS,St养ac沫kE伤le毒me撒nt骗Ty析pe*x){祖/戒*将栈S的栈秆顶元铺素弹愁出,胆放辅到x所指锁的存膀储空深间中技,们但栈舍顶指驼针保止持不者变爸*/if统(S持->队to娘p=衫=-拆1)见/贷*栈为兔空*/re戴tu判rn融(F遮AL渴SE吗);听el培se盛{*x春=摊S极->el肢em[S-梳>t雪op];re肝tu射rn铺(T测RU奸E)侦;}尖}在栈晋的共泥享技幻玉术中涝最常谈用的怒是两犯个栈亚的共丛享技溉术:览它普主要蔑利用盟了栈机“栈浴底位筒置不匹变,沫而栈欺顶位裁置动属态变犬化”跨的特械性。秒首先信为两要个栈漂申请慕一个蒙共享忌的一介维数欺组空榆间S[M],将两想个栈削的栈里底分酱别放萝在一洪维数螺组的便两端狡,分沸别是0,M-粉1。由于筹两个亲栈顶奥动态执变化姻,这喝样可窜以形扫成互敬补,击使得偶每个泻栈可匆用的盐最大封空间秘与实砌际使贪用的菌需求座有关桃。由总此可承见,芝两栈德共享愉比两痒个栈持分别统申请M/贷2的空脸间利痰用率富高。宰两奶栈共铃享的柿数据俗结构球定义研如下氏:#de秀fi比ne分M礼1氧00誉ty没pe返de侮fst衔ru酒ct{St首ac遇kE缎le从me皇nt骄Ty伸peSt润ac弄k[M];St仗ac冷kE零le术me歇nt销Ty压peto瞎p[2];柿/*讨to敬p[0]和to哄p[1]分别浑为两壤个栈谜顶指霸示器领*/}Dq间St嚼ac汪k;图3.舞3共享矛栈初始授化操样作。桥vo辜idIn筋it冲St普ac将k(圈Dq梳St截ac子k*S并){S-抄>t碧op[0]=-眠1;块S-鱼>t科op[1]=M战;}(2胖)进栈暖操作右算法易。亮in梦tPu晚sh夹(D采qS五ta稍ck*S岂,St冠ac妖kE武le裁me禁nt捡Ty拍pex,in笑ti)倚{/吵*把数怜据元涨素x压入i号堆霸栈*/if侦(S炉->炊to罪p[0]+1兆==软S-叠>t承op[1])味/晶*栈已藏满*/re迟tu送rn腾(F拴AL挣SE汇);雀sw沉it解ch照(i耍){ca烤se谱0箩:S-悲>t猪op[0]++提;S-负>S傅ta尤ck[S-竖>t吵op[0]]=x胜;br晴ea习k;脸ca配se收1位:S-拣>t尊op[1]--扁;S-窑>S马ta票ck[S-抵>t义op[1]]=x看;br址ea拾k;刑de震fa井ul筑t:伯/塔*参数木错误治*/re私tu陵rn融(F巨AL教SE仍)}re貌tu议rn吐(T承RU委E)蝇;}in啦tPo久p(听Dq含St扮ac甜k*S导,St冠ac激kE朝le脉me搞nt将Ty据pe*x东,in果ti)评{/咏*从i号堆累栈中泳弹出顽栈顶裤元素凭并送炮到x中集*/sw霜it徐ch拦(i液){ca罪se瘦0管:if仆(S谈->睬to耗p[0]==暗-1脊)父r仆et衫ur五n(闯FA轻LS甜E)宏;*x舞=S法->诸St田ac疾k[S-类>t会op[0]];S-遵>t悔op[0]--佩;br息ea历k;甘ca羡se删1酷:if纹(S陡->萍to傲p[1]==吴M)筝re按tu牢rn撕(F迅AL着SE驳);剃*x皮=S陷->夜St您ac雹k[S-抽>t日op[1]];S-忠>t启op[1]++淡;br沉ea说k;高de年fa比ul粉t:真re蜜tu匪rn唱(F盘AL辣SE堪);酬}re是tu哄rn舒(T炮RU瞒E)袄;}(3衡)出栈炊操作兄算法合。2.链栈图3.攻4链栈童示意猎图链栈脊的结盐构可鞠用C语言寻定义窃如下用:ty菠pe棕de做fst完ru达ctno然de览{St告ac刻kE来le坡me瞧nt苦Ty株peda倚ta驱;st刮ru填ctno艘de域*思ne衡xt翼;韵}Li饼nk跌St息ac炒kN墙od日e;ty渗pe廊de臣fLi棵nk歌St堤ac定kN躁od崭e*Li恭nk魔St撞ac宵k;(1袍)进栈谁操作贷。in辫tPu昂sh己(L尸in直kS止ta浓ckto泼p,St晚ac痛kE林le机me东nt否Ty株pex)雾/*将数级据元纤素x压入闲栈to盛p中普*/致{Li姻nk栗St址ac踏kN拢od包e*演te尚mp华;te感mp撑=(Li描nk诸St拍ac亲kN跟od笋e*死)ma留ll役oc钟(s柏iz茶eo李f(喉Li俩nk早St静ac愿kN置od优e))煤;if仓(t草em格p=再=N橡UL稳L)寻re魄tu貌rn低(F看AL宣SE缓);博/*申请务空间筋失败认*/te江mp雪->佛da略ta绞=x回;te夸mp全->具ne湖xt秩=t倍op郑->路ne趴xt旬;to网p-意>n矩ex球t=啦te文mp染;碧/歇*修改约当前构栈顶虏指针伯*/颗re钢tu不rn甲(T晌RU翅E)顾;}(2退)出栈衣操作园。in欣tPo摇p(丈Li撇nk胡St竿ac诉kto静p,St抽ac犹kE敢le本me非nt稀Ty寻pe*x乓){销/茄*将栈to伟p的栈进顶元割素弹扒出,凶放稻到x所指筝的存挪储空扯间中潜*/Li坏nk胜St借ac脾kN菠od慨e*岩te罩mp胶;te扫mp丑=t否op眯->肾ne友xt福;if售(t低em滔p=局=N涨UL杰L)抵/腔*栈为报空*/re脸tu吩rn误(F杂AL仇SE怜);构to陶p-弯>n覆ex舟t=医te霜mp佛->律ne山xt思;*x叉=t任em何p-沸>d黑at睡a;浸fr赛ee闲(t嫁em抬p)兼;瓦/咽*释放绞存储恢空间葛*/re也tu趁rn进(T纲RU册E)往;}3.煤3栈的省应用每举例1.数制俘转换敞假设陵要将绝十进恭制数N转换洽为d进制吃数,恨一个供简单蛾的转脆换算栏法是类重复硬下述陷两步厦,骄直到N等于港零:巧X密=根N遭mo坚d跨d痛(其中mo庆d为求斑余运鸽算)N逢=他N姻di班v播d僻(其中di押v为整额除运投算)vo养idCo汇nv矮er援si激on留(i支ntN)什{/驾*对于而任意际的一哭个非盏负十惨进制局数N,打印截出与脉其等圆值的屋二进丑制数屿*/St捉ac汽k绿S;in坏tx;旦/扣*衡S为顺雕序栈持或链斯栈蜂*/In康it嘴St朗ac册k(份&S);古wh至il台e(焰N>斥0)里{x=芹N%叔2;盾Pu给sh战(&仍S,餐x挎);各/*将转更换后鉴的数廊字压选入栈S酸*/击N=哗N/昌2;犁}wh喝il浴e(!Is父Em业pt教y(始S))仇{Po糠p(如&S丹,&咐x)沸;pr撕in忘tf等(″哥%d饱″,粉x);断}}2.括号州匹配后问题假设呆表达厌式中埋包含舅三种木括号厕:圆墙括号宏、搬方括列号和向花括碌号,摩它客们可夺互相起嵌套酷,摧如([{是}]([络])挑)或(剑{([即]呢[(查)])足}春)等均轧为正桥确的寨格式进,梨而{[馋]}乳)卖}或{[(茫)]挤或([锁]}均为叙不正众确的府格式秆。禽在检蹄验算闭法中幸可设饺置一蛙个栈仓,粗每读历入一孤个括风号,窜若是逼左括日号,执则直彩接入秩栈,凤等垂待相哥匹配厉的同饺类右匪括号腊;若芹读入有的是尊右括走号,家且腿与当秒前栈淘顶的播左括症号同呀类型贯,则虫二者酱匹配青,巾将栈告顶的效左括举号出煤栈,筑否糟则属突于不尝合法出的情饮况。品另外药,如喂果输锈入序君列已纷读尽泊,而昂栈中包仍有采等待潜匹配湖的左叮括号夺,或裹者读阿入了解一个岂右括厦号,探而栈框中已偿无等章待匹咏配的枝左括号慈,均湾属不撇合法扣的情骄况。警当输塔入序午列和疏栈同假时变顿为空貌时,勾说士明所古有括损号完塘全匹付配。vo俘idBr吩ac损ke忽tM冠at裙ch足(c苍ha析r*st巩r)客=/*st律r[]中为港输入深的字裕符串牺,卵利用荐堆栈命技术债来检帽查该钻字符霉串中应的括亏号是者否匹找配*/云={St蓝ac请k典S;in季ti;支c栗ha租rch;In泉it鉴St拨ac突k(尾&S);崭Fo紧r(悲i=纺0;st叠r[i]翅!=崇′\茶0′叹;控i+简+)艘/*对字岗符串络中的汉字符坦逐一灰扫描感*/{sw抗it马ch蜡(s备tr[i]){苹ca咬se绑′未(′熔:ca养se窗′[′:降ca智se过′献{′利:Pu缝sh难(&爪S,党st丈r[i]);面br剩ea伐k;糊ca晃se队′被)′旗:ca差se尚′]′:额ca阀se羡′鼠}′泪:if触(I喉sE销mp味ty朋(S))彼{pr劲in级tf切(″脂\n右括求号多央余!″异);业re泉tu横rn吧;}留el锋se悄{Ge捕tT怪op蔬(&赛S,斜&c荐h);牌if垒(M僻at可ch尊(c皇h,通st裤r[i]))琴/稼*用Ma给tc哗h判断山两个成括号往是否古匹配核*/Po预p(尚&S旅,&贷ch);岔/膨*已匹坊配的辟左括抽号出著栈*/el观se覆{pr遗in枪tf饼(″妹\n对应崭的左倚右括肆号不途同类!″轿);毛re连tu种rn欠;}毯}}/招*s吉wi口tc克h*夸/}/攀*f幅or闹*/毕if厨(I落sE贯mp箱ty喂(S))锻pr号in遥tf文(″辨\n括号宝匹配!″丸);抛el揭se测pr雾in欲tf刷(″繁\n左括甚号多跑余!″络);鬼}3.表达木式求励值表达疮式求驼值是拆高级娘语言折编译也中的发一个允基本授问题绞,流是栈扯的典间型应壮用实束例。恰任夸何一鹅个表松达式零都是降由操阁作数(o途pe惑ra浩nd导)、运算购符(o测pe羡ra关to跟r)和界荣限符(d剥el垒im出it耐er集)组成乡丰的。稀操作寸数既失可以纽奉是常奖数,住也扶可以洋是被搏说明喝为变强量或恋常量词的标幻玉识符距;运坝算符给可以坝分为智算术器运算偷符、偿关允系运数算符投和逻辑谱运算讲符三用类;妇基本舱界限侨符有迫左右刘括号付和表乱达式拘结束听符等规。1)如无括驻号算鼻术表蹲达式抱求值元表达亦式计俘算程序饥设计乎语言州中都圆有计较算表谈达式贵的问赌题,震这杜是语起言编泡译中河的典吸型问驾题。参(1呆)表达告式形室式:执由番运算谦对象君、笛运算股符及败必要勒的表慕达式排括号立组成摊;及(2谣)表达捕式运袖算:齐运炸算时锯要有嚼一个甚正确另的运永算形笑式顺查序。由于涝某些怜运算限符可远能具奏有比钞别的效运算渐符更厘高的泻优先滤级,我因此趟表达爱式不棵可能践严格仆的从私左到岸右,淹见图3.速5。图3.宽5表达饺式运舰算及戚运算蜂符优歇先级图3.饶6无括肉号算山术表魔达式戴的处秧理过前程2)填算术抽表达协式处禽理规灶则(1秆)规定萍优先厅级表签。(2锄)设置晓两个绪栈:OV归S(运算猜数栈)和OP已TR电(运算办符栈)。(3孔)自左树向右氧扫描腰,遇荒操作车数进OV驶S,遇操软作符狸则与OP隆TR栈顶裤优先亚数比炼较:宁当前险操作击符>O绑PT骑R栈顶,当前铃操作请符进OP岸TR栈当险前操绵作符深≤OP翠TR栈顶啦,OV浇S栈顶认、次娇顶和OP室TR栈顶摄,退橡栈形民成运拼算T(粉i),T(符i)进OV重S栈。逃例:史实命现A/夕B↑左C+句D*舱E#的运己算过竿程时召栈区斧变化驶情况松如图3.春7所示倒。图3.洋7构A/伶B↑城C+专D*过E运算点过程绳的栈陵区变者化情爸况示第意图3)局带括昆号算届术表悠达式恐假设丑操作专数是奇整型粮常数施,运表算符屡只含条加、严减、序乘、横除等荷四种虎运算声符,压界谢限符眠有左授右括称号和黑表达斤式起就始、商结束旋符“模#”校,如道:弱#(7+多15)*汁(23革-2仙8/耽4)#迁。守引入期表达腹式起衰始、虏结思束符躺是为磁了方勇便。痛要眠对一勾个简竟单的坑算术浆表达圈式求铃值,别首倾先要郑了解老算术保四则电运算此的规晚则,术即汇:互(1膀)从左瞒算到获右;尊(2疗)先乘毁除,渣后弃加减讲;雀(3及)先括废号内吸,烤后括雄号外从。运算嗓符和垄界限首符可旧统称杆为算卧符,国它们煤构成围的集昂合命笨名为OP乒S。根据荒上述著三条卸运算赤规则纷,在邀运算柿过程晋中,杆任意膀两个肤前后陵相继题出现粒的算眠符θ1和θ2之间耻的优搞先关绿系必查为下秀面三户种关庭系之樱一:θ1<θ2,θ1的优贪先权给低于θ2。拘θ1=θ2,θ1的优袜先权汉等于θ2。莫θ1>θ2,θ1的优屈先权描高于θ2。表3-放1算符逐之间劫的优趴先关孔系实现六算符弃优先爽算法千时需蛾要使薯用两各个工王作栈崇:连一个呜称作op扣er坚at滔or,用以陪存放衰运算菜符;拾另一布个称钓作op众er为an葱d,用以哪存放鸭操作缝数或段运算谎的中猪间结谋果。枣算膜法的稠基本携过程晶如下约:首先沾初始足化操拌作数赚栈op引er阅an娘d和运炎算符慨栈op恳er追at之or,并将缘瑞表达效式起哪始符司“#夸”压暂入运地算符各栈;依次慨读入灭表达挂式中产的每控个字漂符,曾若是么操作爆数则眉直接翠进入暗操作查数栈op失er母an漆d,若是她运算英符,冰则与雄运算编符栈op声er亩at膊or的栈丈顶运闷算符东进行爱优先呢权比门较,晃并做窜如下厦处理殃:租(1见)若栈伪顶运赶算符造的优软先级华低于鹿刚读稻入的淹运算喉符,杏则钟让刚盘读入渣的运例算符院进op价er鸟at冒or栈;义(2阴)若栈滚顶运饲算符妥的优茅先级烂高于损刚读宴入的转运算乓符,帖则将百栈顶绿运算叠符退捕栈,序送入θ,同时晒将操苹作数个栈op须er浙an块d退栈锻两次罩,得安到两俊个操请作数a、b,对a、b进行θ运算纹后,办将忙运算虑结果摊作为中味间结汇果推旦入op浇er判an骨d栈;(3崭)若栈丛顶运回算符酿的优控先级度与刚慨读入删的运象算符开的优甜先级歇相同钩,说边明左闭右括萝号相肾遇,惭只需慌将栈顶冤运算就符(钩左括露号)守退栈营即可向。算法生具体它描述喉如下握:in篮tEx裂pE五va属lu至at跃io胁n()吉/*读入柴一个述简单淡算术高表达药式并咏计算尤其值明。op传er途at替or和op糕er纤an隐d分别洲为运物算符迫栈和殊运算原数栈术,OP匪S为运捐算符条集合府*/{In忌it开St拖ac陪k(织&o璃pe颜ra租nd);钳In念it草St更ac识k(浙&o势pe肝ra滋to劈燕r);缩慧Pu骂sh同(&强op哥er疤at贤or枕,′#′)颤;pr够in昂tf房诚(″壤\n幼\n基Pl臂ea虽sein兰pu爪t呜an长e慎xp昆re遍ss瓦io他n(乳En援di固ng傍w捉it毫h#)吗:″挥);泄ch=ge详tc叉ha但r()粉;wh犬il满e(烂ch!=沿′#′|甜|Ge阿tT赢op猴(o泻pe善ra穗to傍r)!冶=姿′#′)科/松*Ge幅tT夕op()通过钞函数值返吴回栈奇顶元庄素*/{if布(!害In绢(c惠h,当OP次S))杜{a驱=Ge展tN薯um捷be择r(移&c茂h);抄/敢*用ch逐个摸读入粱操作留数的获各位买数码线,扶并转简化为境十进慰制数a沉*/禽Pu膀sh内(&旋op显er逢an牛d,功a)突;}歌el茄se斯sw晶it隶ch队(C烦om母pa矛re绿(G术et旗To慎p(千op也er线at夺or勾),跳ch))绞{ca骗se溪′蝴<′借:Pu决sh佛(&庭op训er链at吓or哨,c希h);属ch=ge磨tc肝ha喷r()低;击b要re捏ak罢;ca拔se延′践=′灭:乖Po阻p(戏&o湾pe读ra孔to名r,挺&x岔);边ch=ge撞tc会ha瘦r()轰;贤br筐ea满k;烦ca半se册′龄>′分:词Po议p(勤&o透pe叨ra皂to雪r,续&o饰p)乎;Po移p(丸&o稠pe坝ra充nd至,&让b)柴;Po检p(拔&o乡丰pe育ra忧nd惩,&夹a)贺;v=劲Ex桃ec准ut涉e(榴a,历op飘,b穷);炭/罚*对a和b进行op运算颂*/Pu懒sh骄(&翠op沃er挎an弱d,榨v)屿;br坟ea斜k;瘦}}v=Ge检tT窄op墓(o趣pe奥ra溪nd);育re爽tu滤rn端(v口);让}3.娇1.弃4栈与享递归贝的实孔现栈非翠常重泡要的嫁一个园应用浆是在台程序予设计斤语言衣中用棕来实蜻现递乏归。递归是指婚在定忧义自钩身的浮同时赶又出道现了林对自鞭身的蜂调用营。些如果散一个晚函数头在其刊定义衔体内桐直接敏调用欺自己弹,则怖称其痛为直接抢递归叠函数;如果设一个胁函数饶经过化一系日列的顽中间克调用毯语句潮,匆通过蔑其它路函数丘间接烈调用览自己衡,则逮称其粥为间接递病归函枕数。1.递归豆特性戏问题1)递归波函数织例如凉,霜很多厨数学科函数币是递欧归定颤义的毕,妨如二类阶Fi泥bo避na遭cc焰i数列泻:2)递归僵结构例:n阶Ha素no睬i塔问恐题:中假设饺有三方个分捕别命联名为X、Y和Z的塔材座,甲在登塔座X上插办有n个直粉径大升小各匙不相碧同、候依小甜到大绪编号把为1,2,拔…,n的圆丽盘。也现要尾求将X轴上划的n个圆率盘移红至塔偏座Z上并狮仍按棚同样绑顺序葱叠排绞,圆幻玉盘移巧动时餐必须辈遵循役下列稀原则谷:(1泽)每次土只能折移动舱一个员圆盘嫂;步(2乓)圆盘旋可以仇插在X、Y和Z中的辅任何快一个信塔座愚上;循(3掠)任何领时刻浆都不仗能将葵一个逢较大脊的圆暗盘压押在较泄小的辫圆盘惠之上驼。如何饥实现桶移动已圆盘遍的操亡作呢况?当n=衫1时,昨问题上比较屑简单冈,只书要将屋编号蜡为1的圆疏盘从顶塔座X直接事移动懂到塔宁座Z上即冲可;衫当n>籍1时,攻需纽奉利用盏塔座Y作辅苹助塔旅座,拍若横能设悟法将牧压在使编号眠为n的圆坏盘上献的n-早1个圆乔盘从饥塔座X(依照江上述然原则)移至犹塔座Y上,岛则贩可先疯将编斩号为n的圆即盘从姓塔座X移至孤塔座Z上,疑然后声再将薯塔座Y上的n-何1个圆沫盘(依照息上述秋原则)移至披塔座Z上。榜而如漠何将n-暮1个圆笼盘从乖一个撤塔座议移至挠另一携个塔气座问偏题是幕一个嘱和原他问题粒具有倘相同辨特征近属性景的问坦题,芝只是化问题枪的规踢模小个1,因承此可台以用俘同样鹊方法爹求解技。腾由此祸可得运如下奏算法浆所示方的求炒解n阶Ha按no猜i塔问孝题的怠函数休。vo萌idha旱no开i(纸in芬tn,袋ch逼ar忠x既,c丘ha漫r胆y,等ch垂ar蛙z蚁)敏/*将塔咏座X上按箱直径鄙由小坑到大曾且至脉上而递下编坡号为1至n的n个圆懒盘按剧规则交搬到五塔座Z上,Y可用雹作辅落助塔贴座旨*/{if只(n度==贴1)悦mo床ve厚(x乐,1秧,z金);甘/降*将编弊号为1的圆雁盘从X移动Z源*/丹el丧se舞{虽ha览no泉i(甘n-漏1,肉x,乌z,忙y)撤;弹/*将X上编与号为1至n-严1的圆遇盘移给到Y,朽Z作辅决助塔赶*/mo绪ve喊(x烤,n御,z特);爬/锤*将编缩慧号为n的圆茂盘从X移到Z谁*/永ha庸no罪i(铸n-显1,疗y,任x,城z)酬;值/*将Y上编胡号为1至n-亿1的圆紫盘移颈动到Z,X作辅小助塔选*/}}售下面写给出队三个胞盘子洗搬动丝式时ha胞no美i(胳3,疲A舰,策B,雨C息)递归肢调用拆过程但,满如图3.魂8所示帮。ha册no敌i(数2,圾A,纤C,使B)盖:ha蠢no扔i(道1,惰A,绵B,荐C)剖mo胸ve钳(A险->泳C)颈1号搬在到Cmo田ve否(A快->赖B)瓶2号搬乓到Bha堂no俊i(练1,贷C,绣A,丈B)匆mo集ve爪(C尸->董B)厅1号搬种到Bmo渗ve含(A次->乌c)怨3号搬垒到Cha舌no附i(谋2,绑B,策A,谷C)尖:ha希no胞i(葛1,父B,易C,赖A)焦m资ov轻e(冲B-皱>A篇)钥1号搬境到Amo裕ve骡(B敞->阻c)酷2号搬但到Cha伏no狂i(滨1,掠A,戴B,配C)阵m让ov救e(揭A-素>C绸)罪1号搬状到C图3.椅8续Ha冈no逆i塔的快递归麦函数抵运行递示意隔图3)递归沙问题臣的优毯点通过芝上面泉的例遭子可预看出端,递套归既暴是强显有力腿的数抛学方银法,炎也晶是程沸序设喇计中未一个纲很有炉用的橡工具龟。其册特点腔是对涂递归婚问题赤描述朵简捷坑,结沃构清竟晰,淡程序贝的正秆确性锣容易膏证明谅。艺4)递归亦算法脉求解券问题磨的要巴素递归云算法店就是填算法济中有砍直接静或间垒接调躺用算返法本波身的烫算法台。肤递归饱算法侄的要柴点如简下:分(1扰)问题但具有枕类同辅自身仰的子胜问题泻的性扑质,袍被盯定义磨项在俊定义为中的熊应用刻具有卵更小誓的尺永度。秤(2右)被定竞义项宪在最杂小尺行度上娃有直爬接解火。设计馆递归芬算法稼的方惜法是突:时(1细)寻找厨方法姻,将挎问题漆化为础原问脂题的狱子问轮题求奖解(博例n!惧=n包*(奴n-向1)某!)。陕(2努)设计灯递归甘出口稀,确狮定递休归终乏止条兔件(例求桐解n!时,诵当n=流1时,n!委=是1)。顽5)递归番过程秋的实兵现递归纯进层材(i→办i+工1层)镜系统究需要灭做三不件事太:龟(1塑)保留增本层唉参数姻与返采回地弓址(闲将所驰有的娃实在疮参数幸、己返回槐地址半等信请息传乓递给欲被调辫用函预数保贩存)询;砖(2脊)给下皇层参顺数赋较值(欠为被铲调用饮函数堂的局摊部变与量分也配存慌储区珠);(3艘)将程条序转事移到猎被调锣函数墙的入规口。陷而从颂被调碧用函座数返病回调遵用函扶数之羽前,乞递归俊退层轧(i←膨i+储1层)汇系统薄也应饭完成桑三件眼工作呜:摔(1绒)保存汁被调流函数迈的计误算结廊果;魔(2移)恢复粪上层决参数尝(释咬放被蛮调函诵数的移数据示区)竞;储(3刑)依照终被调隙函数产保存典的返自回地今址,秧将身控制封转移袋回调忌用函挂数。2.递归框算法该到非妹递归读算法缩慧转换递归骂算法呆具有份两个桌特性孔:偷(1浊)递归功算法休是一汗种分雀而治边之、贡把复查杂问宪题分凤解为少简单驼问题桌的求射解问话题方欺法,哥对求乘解某葬些复糕杂问阿题,运递归寄算法椅的分五析方谋法是蠢有效毯的。前(2)坐递归纪算法苗的时工间效楚率低咸。1)消除颈递归饼的原宗因其一墓:有垦利于搞提高魂算法钞时空么性能昂,因芝为递蹲归执辆行时丑需要鄙系统桃提供美隐式泉栈实拍现递文归,威效率罪低且喝费时炊。狂其二塌:肥无应配用递笋归语猪句的湖语言赶设施厘环境怀条件广,有全些计类算机册语言妇不支翁持递殿归功接能,牛如FO厌RT圣RA迫N、C语言误中无赌递归极机制听。其三维:递胜归算婆法是脆一次守执行索完,响这在疤处理学有些饼问题购时不阵合适宋,杀也存原在一浮个把吐递归桃算法转化够为非恋递归穗算法尸的需想求。2)简单划递归尚(尾宵递归芹和单用向递变归)况消除至在简仁单情兄况下跌,滔将递郊归算艇法可炊简化赴为线承性序寄列执蜓行,恐可直轰接转蜂换为兰循环玩实现缓。例:n=最小妨尺度(由自辈然数1直接陵定义)n>墓1其递芳归算堆法如闻下,in悠tf(印in侍tn真)桥/巡寿*设n>淋0阔*/悼{勾if赌n拆=0俗t访he熊n命re炊tu扶rn纪(1语)傍el课se雪r买et轿ur恋n(举n*秆f(朱n-伞1)捡);拔}图3.索9递归伏调用欲变化担情况抓示意递归薄进层牙三件密事:悔保存轰本层卵参数川、所返回论地址;用;传递剩参数荣,驳分配渡局部席数据晋空间;控制宋转移冰。递归未退层涌三件晕事:司恢复怖上层泡;传递君结果分;转断绑点执是行。图3.到10丛f(也3)递归育调用壤流程僻变化魔示意由图3.肯11可看掩出,病整个厘计算腹包括党自上鲁而下纷递归昆调用条进层蜘和自纱下而贵上递粥归返何回退伙层两秘个阶寺段,军所有萍递归鉴调用鉴直接棒或间陵接依复赖f(螺0),所以蛮整个航阶段惹分两废步,城计算码顺序毛在第稿二阶拼段,括先计帝算f(杆0)细→f霉(1款)→具…→血f(扰n)洪,工作借变量y记录气中间锅结果洒。例:霜斐脚波那坦契数家列斐波斯那契功数列秤的递填归算磨法Fi暮b(雁n)如下异,Fi泰b(巷in稠tn)绿{if(n=揪=赞0|风|n凉=分=1)re而tu渗rn运n抢;镰/*递归弃出口常*/el葡se久r云et趁ur曾n烦Fi它b(耍n-蔬1)梅+F净ib非(n炮-2若);悲/适*递归急调用督*/}图3.泛11光F蚀ib圾(5阔)递归洲调用和过程佳示意3-勾12椅Fi姜b(从5)循环熊调用夹过程活示意晓图单向铸递归的一搭个典岔型例对子是芳我们汗讨论耀过的俱计算傲斐波揭那契桃数列蒜的算它法Fi干b(霸n)。其中拥,递咱归调合用语酸句Fi旋b(咳n-军1)和Fi宜b(尘n-柱2)只与奏主调垒用函叹数Fi留b(蔽n)有关移,相善互之势间参促数无程关,恶并且馅这些素递归调用彩语句蜓也和哗尾递眯归一胖样处穿于算刘法的梳最后盼。in覆tFi阻b(仁in姨tn)赞:{in兽tx,幸y,朴z;行if(n=脾=0尺||盈n=枯=1)re虫tu招rn族n嫁;扁/*计算Fi棍b(劈燕0)恨,零F福ib啊(1爪)溜*/蔑el元se普{in多tx=咱0,散y喷=1着,z播;/从*茄x=壶Fi拉b(梯0)食,浊y扫=F蓄ib辈(1盒)巨*/源fo沿r(侍i姜=2刺;i脾<=益n都;衫i验++聋)组{z反=y浑;牛/下*坝z烦=F胡ib扁(i讽-1才)耕*披/箱=y=妹x+威y;卖/*犹y=妇Fi腊b(际i-耍1)渴+F泉ib士(i醋-2怕),监求Fi掠b(粘i),形成奔第i项芬*/x=拐z}恶;顽/*殊x遥=F杠ib乱(i粱-1产)胜*/女}re回tu咬rn所y钱;掏}尾递峰归是指倘递归毁调用访语句览只有搏一个郊,而品且是淡处于法算法矛的最捷后。熟我满们以妖阶乘墙问题针的递殊归算植法Fa者ct衡(n击)为例香讨论土尾递捞归算耽法的呜运行双过程璃。为叉讨论首方便临,勉我们续列出氧阶乘朝问题朋的递鱼归算侄法Fa矩ct庄(n),并简奖化掉能参数n的出绝错检拒查语苗句,出改凉写递蛛归调钞用语粥句的扣位置橡在最洽后,颤算法猫如下两:lo幅ngFa差ct幅(i羊ntn)字{if肌(n傅==息0)较re芹tu杯rn府1岭;re哥tu拔rn观n婆*挨F亩ac次t(巧n-签1)凡;}循环储结构的伤阶乘余问题碍算法Fa死ct牌(n救)如下闻:lo孟ngFa哪ct辛(i阅ntn)雷{in技tfa市c=1烘;fo胆r(作in版ti=遣1;米i<嘴=n挎;i咏++遮)之/肯*依次揪计算f(忽1),…,f(狐n)粘*/偿fa并c=fa旧c*页i;申/模*荣f(遗i)牵=挥f(扯i)锯*图i抬*吵/re痕tu宣rnfa碑c;}3.芬2队麻列3.嗓2.党1队列滔的定关义队列(Q轧ue姜ue岗)是另梯一种鬼限定陡性的煤线性孕表,配它只涂允许单在表糊的一税端插落入元咱素,血而在尖另一如端删系除元裂素,萝所以损队列涝具有落先进扭先出(F趋is李t驴In爷F拌is躺t昨Ou哀t,缩写衫为FI志FO胀)的特燃性。纹在队挣列中蛛,允授许插母入的搜一端甩叫做队尾(r蒙ea或r),允许尘删除厨的一纽奉端则莫称为队头(f什ro罢nt秀)。假设肃队列属为q=码(a1,a2,…,an),那么a1就是月队头语元素准,an则是阴队尾窜元素乡丰。队雨列中宽的元渴素是沫按照a1,a2,…,an的顺创序进绿入的穿,服退出即队列造也必止须按严照同前样的显次序棋依次甩出队勾,也腐就是歌说,据只有维在a1,a2,…,an-洗1都离构开队板列之夺后,an才能术退出历队列镰。与线傅性表稍相同都,仍贫为一夫对一龟关系。顺序音队或链队,以循环药顺序虹队更常翁见。只能巷在队腾首和峡队尾详运算捆,且庸访问染结点搅时依欢照先进割先出(FI肿FO)的原忙则。关键田是掌香握入队和出队操作算,具阵体实锐现依宫顺序务队或团链队证的不恐同而峡不同腿。存储结构运算规则实现方式

逻辑结构只能政在表反的一辞端进幕行插寻入运施算,逝在表摊的另辨一端罗进行响删除鸟运算厦的线砌性表无。基本塔操作:入队潜或出矛队,庙建空脸队列螺,判志队空红或队汪满等杰操作销。尾部艇插入首部禾删除队列苹定义队列课(Qu罢eu剂e)是仅跃在表浊尾进衰行插猛入操般作,庸在表败头进屯行删呀除操佳作的秋线性毯表。活它是债一种篮先进寺先出惜(F宾IF纠O)释的线拾性表怨。例如种:队伐列Q=贱(a1,蓝a2现,a3絮,铺…搁……巾.,an-榴1改,an)在队管尾插开入元因素称面为入队;在瞎队首访删除任元素劝称为出队。队首队尾问:击为什燥么要滤设计翼队列争?它壤有什御么独晴特用导途?离散冰事件自的模饱拟(模没拟事搞件发大生的染先后践顺序,例如典银袍行顾着客队瓶列,狼医院喘患者亦队列超等。筒);操作无系统扣中的枕作业倍调度(一个CP键U执行作多个紧作业蛙);3.简化败程序老设计药。答:队的绿实现兄方式套是本湖节重左点,关键旅是掌川握入队和出队操作军。具荒体实邀现依存储翁结构(链肉队或穷顺序宿队)和的不弓同而秋不同光。1.链队跟列2.顺序鄙队队的合抽象芝数据伶类型离定义:AD追T个Qu将eu化e{数据欣对象够:D=化……数据韵关系旁:R=梦……基本电操作榜:……}织AD虚T贵Qu咏eu蹈e建队涉、入建队或北出队补、判普队空锯或队虑满等蛋,教蓄材罗贝列了曲基本傻操作。重点瓶是循胃环顺狐序队数据缺元素:可以弓是任士意类脚型的蔽数据作,但西必须暖属于戒同一遍个数泰据对新象。告关系:队列烧中数偷据元代素之垒间是联线性得关系愧。当基本宅操作束:(1)In惑it栗Qu缸eu糠e(木&Q):初始义化操追作。谣设汤置一捏个空惨队列倾。狠(2)Is篮Em五pt坏y(界Q):判空泼操作亿。银若队肺列为稻空,浆则月返回TR碰UE,否则艳返回FA碑LS苹E。蛾(3)En棵te赵rQ塌ue揭ue推(&洲Q,x):进队粗操作桨。在援队列Q的队壳尾插炮入x。操作仿成功束,返择回值防为TR释UE,否则延返回割值为FA伐LS配E。苍(4)De忌le炒te阵Qu嗓eu用e(历&Q忆,&遮x):出队挡操作享。使勾队列Q的队切头元导素出赢队,辞并察用x带回布其值犁。写操作按成功桶,返教回值拔为RU老E,否则恨返回步值为FA丈LS称E。域(5)Ge星tH融ea猛d(Q,钞&x):取队遣头元滥素操桶作。寨用x取得飞队元躬素的啄值。住操作脑成功扶,返冈回值药为TR睁UE,否则慎返回朗值为FA棉LS肝E。址(6)Cl间ea袍rQ锻ue盈ue茂(&桑Q):队列摸置空雹操作享。陕将队井列Q置为海空队幻玉列。京(7)De发st遣ro喇yQ瞒ue敞ue暂(&界Q):队列血销毁搞操作永。以释放沿队列掀的空甘间。3.近2.魂2队列威的表迷示和坏实现1.链队暂列图3.谷13链队书列链队挽列类食型定柜义:ty境pe拒de虾fst太ru职ct{Qu制eu纪eP抱trfr封on示t翻;犯//队首化指针Qu逮eu挺eP纹trre淹ar毙;推/偶/队尾简指针}Li静nk堤Qu绑eu肝e;结点赖类型叛定义床:ty酷pe晓de滴fSt慎ru中ctQN拒od解e{QE龙le捐mT能yp窜eda禾ta烫;句//元素St则ru羽ctQN洒od渡e*n愤ex斗t;套//指向陡下一滴结点秆的指冤针}Qn编od凯e,乞*Qu厚eu购eP箩tr;关于茫整个托链队踪蝶的总海体描浮述链队倍中任吃一结沉点的汗结构因简单唤而先风介绍1.链队窃列讨论蹦:空链君队的远特征鱼?Q(队尾)(队首)fronta1a2a3^rearpfront^rear③怎样税实现晋链队息的入队犁和出吓队操作锡?②链队桥会满煮吗?fr让on维t=拨re名ar一般诱不会叶,因糕为删锅除时甜有fr竟ee动作悲。除丙非内家存不恨足!入队纵(尾阳部插翅入)剧:re潜ar螺->猪ne亿xt沟=S璃;吗re色ar授=S烘;出队铲(头盲部删典除)可:fr般on垦t-烂>n票ex廉t=周p-卧>n印ex劫t;SD^链队田示意逐图:完整茫操作同函数厉见教笼材链队气列可律以定梳义如遍下:#de寇fi每ne隶TR绩UE洪1红#de危fi每ne爽FA奋LS烫E汤0ty促pe剃de郊fst莲ru匹ctNo至de穗{Qu捏eu窃eE堡le壤me铲nt近Ty柱peda这ta亩;抖/*数据凭域*/st枣ru单ctNo窗de专ne龄xt醒;敌/*指针丸域*/}Li郊nk助Qu跑eu援eN镇od己e;ty奏pe土de盆fst久ru选ct{Li针nk接Qu研eu券eN酸od驶e*f迈ro借nt农;Li危nk稿Qu翁eu股eN肿od矮e*r橡ea服r;陡}Li杠nk铺Qu借eu膜e;(1)剂初始还化操叮作。因in蛙tIn眨it禽Qu荷eu通e(杜Li词nk犁Qu廊eu嗽e*Q凉){云/*将Q初始购化为集一个毙空的羞链队京列孩*/Q-绳>f超ro棉nt柴=(Li糟nk房诚Qu交eu狭eN势od化e*)ma肌ll款oc树(s悲iz演eo什f(祝Li拘nk吃Qu咱eu毒eN测od抛e))坊;if务(Q闷->待fr拳on怪t!窑=博NU忠LL苏){Q-竹>r体ea愿r=释Q-吐>f西ro微nt区;Q-模>f伤ro途nt秤->筒ne余xt坑=N护UL小L;烦re乌tu碍rn贤(T送RU确E)芬;}el锐se术re每tu碑rn瞒(F棒AL这SE件);登/身*溢出膜!*/}(2)街入队捆操作乎。嘴in率tEn疾te咱rQ嘉ue电ue打(L捷in耀kQ休ue绒ue*Q复,Qu狂eu贱eE石le乳me踩nt剧Ty蹈pex)炉{倚/顿*将数符据元犁素x插入未到队浆列Q中晋*/Li途nk哀Qu拆eu吵eN踩od妹e*Ne爸wN送od劈燕e;Ne聪wN熊od喂e=(Li腊nk璃Qu洽eu蒜eN佩od共e*用)ma借ll浓oc屋(s信iz膀eo震f(介Li凶nk纳Qu击eu控eN逢od喊e))瓦;if帐(N逗ew础No算de!属=N泛UL蓄L)宣{Ne协wN浓od烛e->双da俩ta完=x舞;Ne玻wN披od众e->称ne绞xt价=N述UL殖L;读Q-博>r融ea般r-伞>n执ex喊t=Ne房诚wN罢od刊e;Q-企>r谁ea碑r=Ne腰wN舌od棍e;re吓tu亿rn伪(T胆RU婆E)商;}el钳se何re汽tu哑rn喘(F锤AL臂SE库);昏/继*溢出酒!*/}(3)琴出队辉操作例。有in壮tDe亦le绳te举Qu毕eu令e(评Li埋nk垂Qu碍eu众e*湾Q,Qu秒eu疑eE视le鹿me润nt狭Ty颠pe*x召){绒/希*将队衡列Q的队惰头元拣素出

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论