1. 程式人生 > >資料結構 棧和佇列 演算法設計題

資料結構 棧和佇列 演算法設計題

五 演算法設計題

1. 設有兩個棧S1,S2都採用順序棧方式,並且共享一個儲存區[O..maxsize-1],為了儘量利用空間,減少溢位的可能,可採用棧頂相向,迎面增長的儲存方式。試設計S1,S2有關入棧和出棧的操作演算法。

【哈爾濱工業大學 2001 七 (12分)】

2. 設從鍵盤輸入一整數的序列:a1, a2, a3,…,an,試編寫演算法實現:用棧結構儲存輸入的整數,當ai≠-1時,將ai進棧;當ai=-1時,輸出棧頂整數並出棧。演算法應對異常情況(入棧滿等)給出相應的資訊。

【南京航空航天大學 1998 六 (10分)】

3. 設表示式以字元形式已存入陣列E[n]中,‘#’為表示式的結束符,試寫出判斷表示式中括號(‘(’和‘)’)是否配對的C語言描述演算法:EXYX(E); (注:演算法中可呼叫棧操作的基本演算法。)

【北京科技大學 2001 九、1 (10分)】

4. 從鍵盤上輸入一個逆波蘭表示式,用偽碼寫出其求值程式。規定:逆波蘭表示式的長度不超過一行,以$符作為輸入結束,運算元之間用空格分隔,操作符只可能有+、-、*、/四種運算。例如:234 34+2*$

【山東師範大學 1999 七  (10分)】

5. 假設以I和O分別表示入棧和出棧操作。棧的初態和終態均為空,入棧和出棧的操作序列可表示為僅由I和O組成的序列,稱可以操作的序列為合法序列,否則稱為非法序列。

  (1)下面所示的序列中哪些是合法的?

         A. IOIIOIOO     B. IOOIOIIO      C. IIIOIOIO     D. IIIOOIOO

  (2)通過對(1)的分析,寫出一個演算法,判定所給的操作序列是否合法。若合法,返回true,否則返回false(假定被判定的操作序列已存入一維陣列中)。【武漢大學 2000 五、2】

6.設計一個演算法,判斷一個算術表示式中的括號是否配對。算術表示式儲存在帶頭結點的單迴圈連結串列中,每個結點有兩個域:ch和link,其中ch域為字元型別。【南京郵電大學 2000

7. 請利用兩個棧S1和S2來模擬一個佇列。已知棧的三個運算定義如下:PUSH(ST,x):元素x入ST棧;POP(ST,x):ST棧頂元素出棧,賦給變數x;Sempty(ST):判ST棧是否為空。那麼如何利用棧的運算來實現該佇列的三個運算:enqueue:插入一個元素入佇列; dequeue:刪除一個元素出佇列;queue_empty:判佇列為空。(請寫明演算法的思想及必要的註釋)

【西安電子科技大學2001軟體五(10分)】【上海交通大學1999 二(12分)】【河海大學1998 三(12分)】

類似本題的另外敘述有:

(1)有兩個長度相同的棧S1,S2,已知以下入棧、出棧、判棧滿和判棧空操作:

PROCEDURE   push(Stack:Stacktype;x:Datatype);

FUNCTION    Pop(Stack:Stacktype ):Datatype;

FUNCTION    Full (Stack:Stacktype):Boolean;

FUNCTION    Empty(Stack:Stacktype)Boolean;

現用此二棧構成一個佇列,試寫出下面入佇列、出佇列操作演算法:

PROCEDURE  EnQueue(x:Datatype);

FUNCTION   DeQueue: Datatype;【北京郵電大學 2000 六(10分)】

8. 設結點結構為(data,link),試用一個全域性指標p和某種連結結構實現一個佇列,畫出示意圖,並給出入隊addq和出隊deleteq過程,要求它們的時間複雜性都是O(l)(不計new和dispose時間)

【東南大學 1996  二 (10分)】

9. 假設以帶頭結點的迴圈連結串列表示佇列,並且只設一個指標指向隊尾結點,但不設頭指標,如圖所示(編者略),請寫出相應的入佇列和出佇列演算法。【西安電子科技大學 1999計應用 六 (10分)】

10. 如果允許在迴圈佇列的兩端都可以進行插入和刪除操作。要求:

(1)寫出迴圈佇列的型別定義;

(2)寫出“從隊尾刪除”和“從隊頭插入”的演算法。【北方交通大學 1994  三 (12分)】

11. 在一個迴圈鏈隊中只有尾指標(記為rear,結點結構為資料域data,指標域next),請給出這種佇列的入隊和出隊操作的實現過程。【山東科技大學 2002  一、2 (6分)】

12. 雙端佇列(duque)是一個可以在任一端進行插入和刪除的線性表。現採用一個一維陣列作為雙端佇列的資料儲存結構,使用類PASCAL語言描述如下:

CONST maxsize=32;          {陣列中可容納的元素個數}

TYPE duque=RECORD

            elem: ARRAY[0..MAXSIZE-1] OF datatype;    {環形佇列的存放陣列}

            end1,end2:0..MAXSIZE;                     {環形陣列的兩端}

          END;

試編寫兩個演算法add(Qu:duque;x:datatype;tag:0..1)和delete(Qu:duque; var x:datatype; tag:0..1)用以在此雙端佇列的任一端進行插入和刪除。當tag=0時在左端endl端操作,當tag=1時在右端end2端操作。【清華大學  1998  二(10分)】

13. 一個雙端佇列deque是限定在兩端end1,end2都可進行插入和刪除的線性表。隊空條件是end1=end2。若用順序方式來組織雙端佇列,試根據下列要求,定義雙端佇列的結構,並給出在指定端i(i=1,2)的插入enq和刪除deq操作的實現。

(1) 當隊滿時,最多隻能有一個元素空間可以是空的。

(2) 在做兩端的插入和刪除時,佇列中其它元素一律不動。【清華大學 1999 六(12分)】

14. 已知Q是一個非空佇列,S是一個空棧。僅用佇列和棧的ADT函式和少量工作變數,使用Pascal或C語言編寫一個演算法,將佇列Q中的所有元素逆置。棧的ADT函式有:

makeEmpty(s:stack);               置空棧

push(s:stack;value:datatype);     新元素value進棧

pop(s:stack):datatype;            出棧,返回棧頂值

isEmpty(s:stack):Boolean;         判棧空否

佇列的 ADT函式有:

enqueue(q:queue:value:datatype);  元素value進隊

deQueue(q:queue):datatype;        出佇列,返回隊頭值

isEmpty(q:queue):boolean;         判佇列空否 【清華大學 2000 六(12分)】

15. 將n個佇列順序對映到陣列v[l..m]中,每一佇列在v中表示為一迴圈佇列。試畫出其示意圖並寫出對應這種表示的addq和deleteq過程。【東南大學 1993 二(20分)】

16. 設整數序列a1,a2,…,an,給出求解最大值的遞迴程式。【南京航空航天大學 2000 六】

17.線性表中元素存放在向量A(1,…,n)中,元素是整型數。試寫出遞迴演算法求出A中的最大和最小元素。【北京郵電大學 1994 八 (10分)】

18. 已知求兩個正整數m與n的最大公因子的過程用自然語言可以表述為反覆執行如下動作:第一步:若n等於零,則返回m;第二步:若m小於n,則m與n相互交換;否則,儲存m,然後將n送m,將儲存的m除以n的餘數送n。

(1)將上述過程用遞迴函式表達出來(設求x除以y的餘數可以用x MOD y 形式表示)。

(2)寫出求解該遞迴函式的非遞迴演算法。【北京航空航天大學 2001 五(15分)】

19. 寫出和下列遞迴過程等價的非遞迴過程。

PROCEDURE   test(VAR  sum:integer);

    VAR  a:integer,

BEGIN

      read(a);

      IF a=0  THEN  sum:=1

              ELSE  BEGIN test(sum); sum:=sum*a;END;

write(sum);

END;                【清華大學 1996 二】

20. 試將下列遞迴過程改寫為非遞迴過程。

        void  test(int  &sum)

        { int  x;

          scanf(x);

          if(x=0) sum=0 else {test(sum); sum+=x;}

          printf(sum);

        }         【北京輕工業學院 2000 三 (15分)】

21. 已知Ackermann函式定義如下:

    (1) 寫出Ack(2,1)的計算過程。

(2) 寫出計算Ack(m,n)的非遞迴演算法。 【北京航空航天大學 1999  六 (15分)】

22.設計演算法以求解從集合{1..n}中選取k(k<=n)個元素的所有組合。例如,從集合{1..4}中選取2個元素的所有組合的輸出結果為:1  2,1  3,1  4,2  3, 2  4,3  4。

【合肥工業大學 2000 五、5(8分)】

相關推薦

資料結構 佇列 演算法設計

五 演算法設計題 1. 設有兩個棧S1,S2都採用順序棧方式,並且共享一個儲存區[O..maxsize-1],為了儘量利用空間,減少溢位的可能,可採用棧頂相向,迎面增長的儲存方式。試設計S1,S2有關入棧和出棧的操作演算法。 【哈爾濱工業大學 2001 七 (12分)】 2

浙江中醫藥大學-《資料結構》-佇列演算法設計

1、從鍵盤上輸入一個字尾表示式,試編寫演算法計算表示式的值。規定:逆波蘭表示式的長度不超過一行,以$符作為輸入結束,運算元之間用空格分隔,操作符只可能有+、-、*、/四種運算。例如:234 34+2*$。 思路:逆波蘭表示式(即字尾表示式)求值規則如下:設立運算數棧OPND,對錶達式從左到右掃描(讀入),當表

資料結構佇列、遞迴演算法

知識要點: 棧的定義、結構特點及其儲存方式(順序儲存與連結儲存)和基本操作的實現演算法; 佇列的結構、特點及其儲存方式(順序儲存與連結儲存)和基本操作的實現演算法。 遞迴的基本概念和實現原理以及用遞迴的思想描述問題和書寫演算法的方法; 用棧實現遞迴問題的非遞迴解法。

資料結構 - 佇列

資料結構 - 棧和佇列 介紹 棧和佇列是兩種很簡單, 但也很重要的資料結構, 在之後的內容也會用到的

資料結構---佇列結構體實現)

棧(LIFO) 棧(stack)是一種只能在一端進行插入或刪除操作的線性表。 棧頂(top):允許進行插入、刪除操作的一端 棧底(bottom):另一端稱為棧底 進棧或入棧(push):插入操作 出棧或退棧(pop):棧的刪除操作 n個不同元素通過一個棧產生的出棧

資料結構---佇列(例題、練習及解答)

棧的應用 Q1:簡單表示式求值 限定的簡單表示式求值問題是使用者輸入一個包含+、-、*、/、正整數和圓括號的合法算術表示式,計算該表示式的結果。 思路:(1)將算術表示式轉換成字尾表示式 (2)字尾表示式求值 具體執行程式碼: #include <

資料結構——佇列

棧和佇列 一、選擇題 ~~01|03|1|1 ^^設有一個遞迴演算法如下 int fact(int n) { //n大於等於0 if(n<=0) return 1; else return n*fact(n-1); } 則計算fact(n)

資料結構 佇列

文章目錄 1 棧 1.1 抽象資料型別棧的定義 1.1.1 棧頂和棧尾 1.1.2 空棧 1.1.3 特點 1.1.4 上溢和下溢 1.2 棧的表示和實現 1.2.1

資料結構佇列(五)的順序儲存結構鏈式儲存結構的實現

一、 實驗目的1. 熟悉棧的特點(先進後出)及棧的抽象類定義;2. 掌握棧的順序儲存結構和鏈式儲存結構的實現;3. 熟悉佇列的特點(先進先出)及佇列的抽象類定義;4. 掌握棧的順序儲存結構和鏈式儲存結構的實現;二、實驗要求1. 複習課本中有關棧和佇列的知識;2. 用C++語言

還債系列之資料結構——佇列

三、棧 還記得當初第一次學習程式設計的時候還是8051微控制器中的組合語言,現在還記得很清楚,當初遇到的一個簡單的資料結構就是——棧,對應的組合語言中的命令是push和pop。這個結構在生活中是有很多類似的例子的,比如水杯、碗等。該結構的特點如下: 最大特

資料結構-佇列面試題(下)

面試題四:元素出棧、入棧順序的合法性。如入棧的序列(1,2,3,4,5),出棧序列為(4,5,3,2,1)。 思路: ①首先判斷出棧入棧序列長度是否一致,不一致直接返回false; ②借用一個臨時的棧,依次遍歷入棧序列的每一個元素,每次

資料結構:佇列-迷宮問題求解

//--------------------檔名:Maze.cpp------------------------//----------------------By SunxySong-------------------------//說明:本程式以迷宮問題進行演示,瞭解

資料結構--佇列的面試題

實現一個棧,要求實現Push(出棧)、Pop(入棧)、Min(返回最小值)的時間 複雜度為O(1) 方法1、棧Push時:當棧為空時,push兩次第一個資料。棧頂的數來儲存當前狀態的最小值。 再次Push資料時候,先拿將要Push的資料與棧頂的最小值進行比較,更

資料結構-佇列小結

1棧   1>棧的定義:       棧是限定僅在表尾進行插入和刪除操作的線性表。       我們把插入和刪除的一端稱為棧頂(TOP),另一端稱為棧底(BOTTOM),不包含任何元素的棧稱為空棧。棧又稱為後進先出(Last in first out)的線性表,簡稱L

資料結構-佇列——20150602

//順序棧定義及實現 #include<stdio.h> #include<malloc.h> #include<stdlib.h> //函式結果狀態程式碼 #define TRUE 1 #define

資料結構-佇列面試題(上)

在資料結構的學習過程中,棧和佇列的掌握是十分重要的。所以找了幾個很熱門的面試題試試手並小結一下。先回顧下棧和佇列的特性:棧是後進先出,主要介面有PUSH,POP,TOP,而佇列是先進先出,主要介面有PU

C資料結構-佇列,括號匹配舉例---ShinePans

1.棧和佇列是兩種特殊的線性表             運算操作被限定只能在表的一端或兩端插入,刪除元素,故也稱它們為限定的線性表結構 2.棧的基本運算 1).Stackinit(&s) 構造一個空棧 2).Stackempty(s) 判斷s是否為空棧,當s為空棧

資料結構-佇列

                  &n

演算法資料機構學習_第一章.佇列_1.設計一個有返回中最小元素功能的

設計一個有getMin功能的棧(返回棧中的最小元素) 演算法要求:實現一個特殊的棧,在實現棧的基本功能的基礎上,新增能夠實現返回棧中最小元素的棧,要求演算法的時間複雜讀為O(1),即在常數時間內實現。 思路:在一個棧中在時間複雜讀度為O(1)返回棧中最小元素

線性結構 -- 佇列

線性結構 – 棧和佇列 線性結構是一個有序資料元素的集合。 常用的線性結構有:線性表,棧,佇列,雙佇列,陣列,串。 常見的非線性結構有:二維陣列,多維陣列,廣義表,樹(二叉樹等),圖。 特徵: 1.集合中必存在唯一的一個"第一個元素"; 2.集合中必存在唯一的一個"最後的元素