DS博客做業03--棧和隊列

1.本週學習總結

本週學習的內容是棧和隊列,相比前一單元的順序表內容,容易了不少,操做上更加簡便。順序表包括順序表和鏈表兩塊大內容,順序表的操做主要有建立順序表,查找順序表中的元素,順序表元素的插入和刪除。鏈表的主要操做有頭插法建表和尾插法建表,鏈表的遍歷查找,有序鏈表的插入和刪除以及兩個有序鏈表的合併。而本單元的棧和隊列內容則就簡單的多。首先是棧,棧的特色就是先進後出,經常使用在程序對於符號配對的判斷等功能,操做就是進棧和出棧,以及判斷棧空棧滿。其次是隊列,隊列的特色是先進先出,隊列的內容也主要是進隊和出隊操做,以及判斷隊空和隊滿。這些操做用c++語法只須要stack和queue兩個庫函數就能夠很快的實現。因此隊列和棧的內容會比較簡單一些。c++

2.PTA實驗做業

2.1.題目1:

6-2 在一個數組中實現兩個堆棧 (20 分)
本題要求在一個數組中實現兩個堆棧。算法

2.1.2代碼截圖


2.1.3本題PTA提交列表說明。


·Q1:這道題是結合了vs和同窗的幫助下完成的,因此沒有太多提交記錄,第一次遇到的問題就是maxsize直接用,沒有動態申請內存,致使錯誤一直顯示着。
·A1:在同窗的指導下動態申請了maxsize。
·Q2:第二次的錯誤是在於對於top2指針直接指向-1,而後內存就崩了
·A2:改變了一下想法,指向maxsize試一下,歪打歪撞顯示沒有錯誤狀況。數組

2.2 題目2:

6-11 另類循環隊列 (20 分)
若是用一個循環數組表示隊列,而且只設隊列頭指針Front,不設尾指針Rear,而是另設Count記錄隊列中元素個數。請編寫算法實現隊列的入隊和出隊操做。函數

2.2.2代碼截圖

2.2.3本題PTA提交列表說明。


·Q1:第一次輸出超限了,說實話剛開始我還不知道是什麼錯誤,後面仔細看了下是一個return沒加上去。
·A2:在進隊函數裏面加上return
·Q2:第二次的多種錯誤是真的讓我懵了,在編譯器上調試的好好的,提交上去有問題。
·A2:在幾個同窗的共同研究下,也沒找出問題,最後對比了一下他們的代碼,改了一下空格問題,奇蹟出現了學習

2.3 題目3

7-1 jmu-字符串是否對稱 (20 分)
編寫一個算法利用順序棧判斷一個字符串是不是對稱串。所謂對稱串是指從左向右讀和從右向左讀的序列相同。測試

2.3.1設計思路

這道題的設計思路是定義字符串數組存放輸入的符號,定義一個棧,依次把數組中的元素存入棧中。在定義一個字符變量ch,把棧頂元素賦給ch,拿ch與數組進行比較,這樣子就恰好是從後面開始與前面對比,而後進行判斷是否相同而且執行相應操做。設計

2.3.2代碼截圖


2.3.3本題PTA提交列表說明。


·Q1:第一次提交漏洞有不少,首先是循環的判斷條件,沒有使用for循環,while循環的話條件設置的不行,而後沒有寫下棧空和棧滿的判斷。
·A1:增長了一個i的自增,沒有想到要改變其餘的東西
·Q2:看了其餘同窗的方式以後,分享了本身的算法,而後看了一下他的操做,恍然大悟,要加上判斷條件,for循環能這麼用
·A2:改變了總體的代碼,for循環,加上判斷。3d

2.4 題目4

7-5 jmu-報數遊戲 (15 分)

報數遊戲是這樣的:有n我的圍成一圈,按順序從1到n編好號。從第一我的開始報數,報到m(m<n)的人退出圈子;下一我的從1開始報數,報到m的人退出圈子。如此下去,直到留下最後一我的。其中n是初始人數;m是遊戲規定的退出位次(保證爲小於n的正整數)。要求用隊列結構完成。輸出數字間以空格分隔,但結尾不能有多餘空格。指針

2.4.1設計思路

設置一個棧,定義一個數組,定義m和n變量,首先加入while循環存入元素,當i等於n的時候退出循環,接下來設置for循環數組元素入棧,判斷當i=m的時候,出棧而且輸出,所有出棧而且進入另外一個棧出棧進入原來的棧,重複以上操做直到棧空。調試

2.4.2代碼截圖

2.4.3本題PTA提交列表說明。


·Q1:提交列表裏面只有一條記錄,這條記錄是投機取巧的方式,正規方法還未提交上去,第一次遇到的問題是創建順序序列的時候,創建的序列是char類型的
·A1:char類型致使下面的輸出和自增變得不對稱,因此改變了作法。
·Q2:第二次遇到的問題就是刪除元素這個問題了,剛開始我想的是直接在隊列裏面經過進棧出棧刪除掉,可是發現還沒到水平作到直接刪除。
·A2:改變了本身的作法,從數組裏面刪除。

三、棧和隊列上機考試

錯題1

6-2 另類循環隊列 (15 分)
若是用一個循環數組表示隊列,而且只設隊列頭指針Front,不設尾指針Rear,而是另設Count記錄隊列中元素個數。請編寫算法實現隊列的入隊和出隊操做。

錯題代碼

錯誤分析

這道題的錯誤緣由在於本身沒有對原題的清晰記憶,測試點過了就沒有在去認真思考爲何,致使不少地方有漏洞。首先在於AddQ函數,第七行的Q->Front++就是錯誤的,定義了Count,若是再用Front自增的話,就會致使內存錯誤,接下來隊尾的計算公式也沒有好好記住,寫了一個正常隊列的return方式。其次是DeleteQ函數,隊長指針自減寫成了隊頭指針自增,仍是隊尾的計算公式錯誤,return值也是錯誤的。

反思

之後作完題目要好好的去思考這道題的方式是什麼樣子的,爲何要用Count指針進行操做,還有隊尾的計算公式也是很值得去思考的問題,得記住題目的思路而不是簡單的就過了。

錯題2

7-1 符號配對 (20 分)
請編寫程序檢查C語言源程序中下列符號是否配對://、(與)、[與]、{與}。

錯題代碼

錯誤分析

這道題原本的想法是蠻複雜的,設置循環,而後進行進棧和出棧操做,遇到左括號進棧當遇到右括號的時候進行switch判斷,是否出棧,若是不出棧就輸出,等到最後的時候再判斷棧是不是空的,若是不是也進行相應的輸出。在考試的時候沒能實現這樣子的代碼,用的編譯器是c++,因此沒能本身找到錯誤的地方。

反思

仍是要多作題提高本身的能力和水平,像這道題思路也不會很是的複雜,就是實現代碼這一塊作的仍是很欠缺,因此接下來的時間裏,多寫一寫題目,實現代碼,纔不會說遇到考試就慌張。

錯題3

6-1 在一個數組中實現兩個堆棧 (15 分)
本題要求在一個數組中實現兩個堆棧。

錯誤分析

這道題在剛pta上作的時候就沒有花很大的心思去思考說爲何要這樣子作,剛開始作這道題的時候,沒有想到要給maxsize動態申請內存,由於以前作的題都是直接用maxsize的,因此寫的時候發現很奇怪,說爲何一直顯示錯誤。而後就是兩個棧對於棧頂的定義以及用法不清楚,考試的時候沒有能回憶起來這道題的具體操做,因此沒有可以寫出這道題。

反思

之後的題目仍是的多問問同窗這道題的思路是什麼,動態申請內存這方面必定得了解好,何時須要何時不須要,還有就是結構體裏面的元素何時能夠直接用,何時還須要進行別的操做,這些都是要多加詢問和記憶的。

錯題4

6-3 jmu-ds-表達式求解 (20 分)
輸入一個後綴表達式,程序求出表達式值。

錯題代碼

錯誤分析

這道題在考試的時候是投機取巧過了一個測試點,主要思路在於對後驅表達式的理解以及應用,考試的時候我一直沒能算出題目中給的後驅表達式的計算方法,因此這道題的代碼就沒能實現,這道題主要是對於強制類型轉化和符號的判斷,當遇到運算符號的時候,把以前的棧中元素出棧,而且轉換成int類型進行計算,存儲在另一個數組中,一次對於數組中的元素運用計算方法刪除,而且使用一個變量存儲計算以後的結果。

反思

對於後驅表達式來講,最主要的仍是理解和計算方面,上學期c語言中的強制類型轉化也沒有學的很好因此不少的區域沒有去實現,這道題的思路仍是難在數組怎樣去進棧出棧以及怎樣轉化去進行運算,包括對於一段運算以後的存儲,也是一個問題。

相關文章
相關標籤/搜索