先前章节讨论过的结构和演算法与本章即将要讨论的课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《先前章节讨论过的结构和演算法与本章即将要讨论的课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 先前 章节 讨论 结构 演算法 本章 将要 课件
- 资源描述:
-
1、Chapter 4 Stacks and QueuesJames Chen2005/10/241OutlineslSome Different kinds of StructureslStackslReverse StringlDelimiter matchinglQueueslPriority QueueslParsing Arithmetic Expressionslinfix postfix expression2Different Structuresl先前章節討論過的資料結構和演算法與本章即將要討論的資料結構和演算法有著極為明顯的差異。l有三點主要差異有三點主要差異:l真實世界的資料
2、 v.s.程式設計師的工具lArray 對應到現實資料lStack/Queue 程式內部使用l限制存取的機制l無法使用 index 直接存取.必須借由Interfaces 存取.l一次只能存取一筆資料(最上面 or 最前面).l更抽象化的概念l使用這些資料結構的程式不需要知道實作細節.l實際的儲存機制也不須擔心!(Array or Linked-List or Heap)3郵件之堆積處理方式:l由上而下(Top-to-Bottom)逐一處理 Stackl由最久的開始處理.Queuel重新攪亂,並依重要性重新排列.Priority Queue4Stacks(堆疊)l說明l推入(Push),拋出(
3、Pop)和取值(Peek)l只能存取最近推入(Push)的資料(最上面).l若要存取其他資料,必須先移出最上面的資料.lLIFO Last In First Outl有頂端(Top)一個紀錄變數l應用l檢查原始程式中的成對的括號 l評估數學運算式(Arithmetic Expression)的值.l程式執行過程:副程式之呼叫與返回5Stack Applet6Stack 原始程式l 架構關係StackX-int maxSize;-double stackArray;-int top;+StackX(int s)+push(double j):void+pop():double+peek():do
4、uble+isEmpty():boolean+isFull():booleanStackAppmain(String )7Stack 程式碼 part 1/constructormaxSize=s;/set array sizestackArray=new doublemaxSize;/create arraytop=-1;/no items yet8Stack 程式碼 part 2/put item on top of stackstackArray+top=j;/increment top,insert item/take item from top of stackreturn stac
5、kArraytop-;/access item,decrement top9Stack 程式碼 part 3/peek at top of stackreturn stackArraytop;/true if stack is emptyreturn(top=-1);/true if stack is fullreturn(top=maxSize-1);10StackApp 程式碼class StackApppublic static void main(String args)StackX theStack=new StackX(10);/make new stacktheStack.pus
6、h(20);/push items onto stacktheStack.push(40);theStack.push(60);theStack.push(80);while(!theStack.isEmpty()/until its empty,/delete item from stackdouble value=theStack.pop();System.out.print(value);/display itSystem.out.print();/end whileSystem.out.println();/end main()/end class StackApp11push(49)
7、Stack 程式 圖示法pop();pop()12Error Handlingl現有版本之問題l使用者必須負責檢查!lisEmpty()and isFull():將StackX/Queue錯誤例外的處理加入 StackX/Queue 之內,讓使用者不須擔心此問題!修改 push()/insert(),pop()/remove()and peek()/peekFront()method.13Example of Stack:倒轉字母StackX-int maxSize;-double stackArray;-int top;+StackX(int s)+push(double j):void+p
8、op():double+peek():double+isEmpty():boolean+isFull():booleanReverser-String input;-String output;+Reverser(String in)+doRev():StringReverseAppmain(String arg)14Example of Stack:doRev()/reverse the stringint stackSize=input.length();/get max stack sizeStackX theStack=new StackX(stackSize);/make stack
9、for(int j=0;jinput.length();j+)char ch=input.charAt(j);/get a char from inputtheStack.push(ch);/push itoutput=;while(!theStack.isEmpty()char ch=theStack.pop();/pop a char,output=output+ch;/append to outputreturn output;/end doRev()15Example of Stack:分隔符號之配對-Delimiter Matchingl堆疊之應用之一:Parse(解析)特定字串之內
10、容是否符合語法規範cd/correctabcde/correctab(cde/not correct;doesnt match(abcde/not correct;nothing matches final ab(c)/not correct;Nothing matches opening 16Delimiter Matching 之觀念之觀念nExample:a b (c d e )f a b (c d )e f 17Delimiter Matching 之相關作法之相關作法lDelimiterlOpening Delimiter ,(lClosing Delimiter ,)l作法:l逐一
11、讀取字元l遇到Opening Delimiter就放進 stackl遇到 Closing Delimiter 就從 stack pop 出來一個opening delimiter;若 stack 沒有 Opening Delimiter 可供讀取,則表示有誤!l並比較是否是同一類 delimiter,若不同類就是有誤!l若無資料可供輸入而 Stack 是 empty,就表示原式是正確無誤,否則就有誤!18Delimiter Matching 程式架構程式架構-bracket.javaStackX-int maxSize;-double stackArray;-int top;+StackX(i
12、nt s)+push(double j):void+pop():double+peek():double+isEmpty():boolean+isFull():booleanBracketChecker-String input;+BracketChecker(String in)+check():voidBracketApp+main(String)19Delimiter Matching 程式架構程式架構-check()method part 12.3.int stackSize=input.length();/get max stack size4.StackX theStack=new
13、 StackX(stackSize);/make stack5.for(int j=0;j=front)return rear-front+1;else return(maxSize-front)+(rear+1);34Efficiency of Queueslinsert():O(1)lremove():O(1)lpeek():O(1)35Deques:double-ended queue-同時擁有 stack 與 queue 的特性!l可以從 front 或 rear 進行插入或刪除資料的動作.linsertLeft()and insertRight(),and lremoveLeft()
14、and removeRight()l應用linsertLeft()+removeLeft()StacklinsertLeft()+removeRight()Queue36Priority Queues(優先佇列優先佇列)l佇列中的資料是依照優先等級來排列:l具有最高優先權者排在front,以便即時被處理!l具有相同優先權的依照FIFO排列!l優先佇列優先佇列也是程式設計的工具之一。lOS 的作業排程37Priority Queue 之實作l一般仍和Queue相同,會有 front 和 rearl但是通常我們需要仍夠較最高優先(鍵值最小or最大)的資料進行處理.也希望能夠新的資料.使用 heap
15、(MaxHeap,MinHeap)的資料結構來實作儲存空間,但是效率就差很多!讀取(移除)的速度很快!(Why)插入的速度很慢!(Why)38PriorityQ Applet-Front/Rear 作法和原有作法和原有 Queue 不同不同!39Some Approach for Implementationl l讀取(移除)的速度很快!(Why)l插入的速度很慢!(Why)l讀取(移除)的速度很慢!(Why)l插入的速度很快!(Why)40PriorityQ 示意圖insert(6)remove();remove()41Priority Queue 程式架構PriorityQ-int max
16、Size;-double queArray;-int nItems;+Queue(int s)+insert(double j):void+remove():double+peekMin():double+size():int+isEmpty():boolean+isFull():booleanPriorityQAppmain(String )42Priority Queue 程式碼 part 1public PriorityQ(int s)/constructormaxSize=s;queArray=new doublemaxSize;nItems=0;43Priority Queue 程式
17、碼 part 2public void insert(double item)/insert itemint j;if(nItems=0)/if no items,queArraynItems+=item;/insert at 0else /if any items,for(j=nItems-1;j=0;j-)/start at end,if(item queArrayj)/if new item larger,queArrayj+1=queArrayj;/shift upward else/if smaller,break;/done shifting/end forqueArrayj+1=
18、item;/insert itnItems+;/end else(nItems 0)/end insert()44Priority Queue 程式碼 part 3public double remove()/remove minimum item return queArray-nItems;public double peekMin()/peek at minimum item return queArraynItems-1;public boolean isEmpty()/true if queue is empty return(nItems=0);public boolean isF
19、ull()/true if queue is full return(nItems=maxSize);45PriorityQApp 程式碼class PriorityQApppublic static void main(String args)throws IOException PriorityQ thePQ=new PriorityQ(5);thePQ.insert(30);thePQ.insert(50);thePQ.insert(10);thePQ.insert(40);thePQ.insert(20);while(!thePQ.isEmpty()double item=thePQ.
20、remove();System.out.print(item+);/10,20,30,40,50/end whileSystem.out.println();/end main()/-/end class PriorityQApp46Efficiency of Priority Queuesl現有效能linsert():O(N)lremove():O(1)l改進方案l改以 heap 實作!47Parsing Arithmetic Expressions統一更正英中譯名統一更正英中譯名(pp.137 161):linfix:插入 中序中序lpostfix:字尾 後序後序lprefix:字首 前序
21、前序lexpression:表達(法)運算式運算式lpostfix notation:字尾(的)界限 後序表示式後序表示式 linfix notation:插入界限 中序表示式中序表示式lprefix notation:字首(的)界限 前序表示式前序表示式 lpostfix expression:字尾表達法 後序運算式後序運算式loperator:運算元 運算子運算子loperand:運算子 運算元運算元48Expression(運算式)lExpression(運算式)l由運算子(Operator)與運算元(Operand)構成的式子l運算子:+-*/%l運算元:1 2 6 7 i j sum
展开阅读全文