DS部落格作業03 棧和佇列

2022-04-12 21:06:18 字數 3630 閱讀 3449

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

6-2 在乙個陣列中實現兩個堆疊 (20 分)

本題要求在乙個陣列中實現兩個堆疊。

·q1:這道題是結合了vs和同學的幫助下完成的,所以沒有太多提交記錄,第一次遇到的問題就是maxsize直接用,沒有動態申請記憶體,導致錯誤一直顯示著。

·a1:在同學的指導下動態申請了maxsize。

·q2:第二次的錯誤是在於對於top2指標直接指向-1,然後記憶體就崩了

·a2:改變了一下想法,指向maxsize試一下,歪打歪撞顯示沒有錯誤情況。

6-11 另類迴圈佇列 (20 分)

如果用乙個迴圈陣列表示佇列,並且只設佇列頭指標front,不設尾指標rear,而是另設count記錄佇列中元素個數。請編寫演算法實現佇列的入隊和出隊操作。

·q1:第一次輸出超限了,說實話剛開始我還不知道是什麼錯誤,後面仔細看了下是乙個return沒加上去。

·a2:在進隊函式裡面加上return

·q2:第二次的多種錯誤是真的讓我懵了,在編譯器上除錯的好好的,提交上去有問題。

·a2:在幾個同學的共同研究下,也沒找出問題,最後對比了一下他們的**,改了一下空格問題,奇蹟出現了

7-1 jmu-字串是否對稱 (20 分)

編寫乙個演算法利用順序棧判斷乙個字串是否是對稱串。所謂對稱串是指從左向右讀和從右向左讀的序列相同。

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

·q1:第一次提交漏洞有很多,首先是迴圈的判斷條件,沒有使用for迴圈,while迴圈的話條件設定的不行,然後沒有寫下棧空和棧滿的判斷。

·a1:增加了乙個i的自增,沒有想到要改變其他的東西

·q2:看了其他同學的方式之後,分享了自己的演算法,然後看了一下他的操作,恍然大悟,要加上判斷條件,for迴圈能這麼用

·a2:改變了整體的**,for迴圈,加上判斷。

報數遊戲是這樣的:有n個人圍成一圈,按順序從1到n編好號。從第乙個人開始報數,報到m(m設定乙個棧,定義乙個陣列,定義m和n變數,首先加入while迴圈存入元素,當i等於n的時候退出迴圈,接下來設定for迴圈陣列元素入棧,判斷當i=m的時候,出棧並且輸出,全部出棧並且進入另乙個棧出棧進入原來的棧,重複以上操作直到棧空。

·q1:提交列表裡面只有一條記錄,這條記錄是投機取巧的方式,正規方法還未提交上去,第一次遇到的問題是建立順序序列的時候,建立的序列是char型別的

·a1:char型別導致下面的輸出和自增變得不對稱,所以改變了做法。

·q2:第二次遇到的問題就是刪除元素這個問題了,剛開始我想的是直接在佇列裡面通過進棧出棧刪除掉,但是發現還沒到水平做到直接刪除。

·a2:改變了自己的做法,從陣列裡面刪除。

6-2 另類迴圈佇列 (15 分)

如果用乙個迴圈陣列表示佇列,並且只設佇列頭指標front,不設尾指標rear,而是另設count記錄佇列中元素個數。請編寫演算法實現佇列的入隊和出隊操作。

這道題的錯誤原因在於自己沒有對原題的清晰記憶,測試點過了就沒有在去認真思考為什麼,導致很多地方有漏洞。首先在於addq函式,第七行的q->front++就是錯誤的,定義了count,如果再用front自增的話,就會導致記憶體錯誤,接下來隊尾的計算公式也沒有好好記住,寫了乙個正常佇列的return方式。其次是deleteq函式,隊長指標自減寫成了隊頭指標自增,還是隊尾的計算公式錯誤,return值也是錯誤的。

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

7-1 符號配對 (20 分)

請編寫程式檢查c語言源程式中下列符號是否配對:/與/、(與)、[與]、。

這道題本來的想法是蠻複雜的,設定迴圈,然後進行進棧和出棧操作,遇到左括號進棧當遇到右括號的時候進行switch判斷,是否出棧,如果不出棧就輸出,等到最後的時候再判斷棧是否是空的,如果不是也進行相應的輸出。在考試的時候沒能實現這樣子的**,用的編譯器是c++,所以沒能自己找到錯誤的地方。

還是要多做題提公升自己的能力和水平,像這道題思路也不會非常的複雜,就是實現**這一塊做的還是很欠缺,所以接下來的時間裡,多寫一寫題目,實現**,才不會說遇到考試就慌張。

6-1 在乙個陣列中實現兩個堆疊 (15 分)

本題要求在乙個陣列中實現兩個堆疊。

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

以後的題目還是的多問問同學這道題的思路是什麼,動態申請記憶體這方面一定得了解好,什麼時候需要什麼時候不需要,還有就是結構體裡面的元素什麼時候可以直接用,什麼時候還需要進行別的操作,這些都是要多加詢問和記憶的。

6-3 jmu-ds-表示式求解 (20 分)

輸入乙個字尾表示式,程式求出表示式值。

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

對於後驅表示式來說,最主要的還是理解和計算方面,上學期c語言中的強制型別轉化也沒有學的很好所以很多的區域沒有去實現,這道題的思路還是難在陣列怎樣去進棧出棧以及怎樣轉化去進行運算,包括對於一段運算之後的儲存,也是乙個問題。

DS部落格作業03 棧和佇列

在createstack函式中為結構體和陣列分配好記憶體,push函式先判斷堆疊是否滿,然後根據tag對相應堆疊進行輸入 pop函式先根據tag判斷對那個堆疊操作,然後再進行判斷是否為空,不空就出棧。q1 輸出搞錯了,滿是沒有輸出tag沒有輸出 q2 沒賦值直接用mystack maxsize 假設...

DS部落格作業03 棧和佇列

本週學習的棧和佇列,對我來說難點在於棧和佇列的輸出輸入中的棧空和隊空判斷,容易不小心把兩個寫混。在程式設計時,選擇用棧的順序儲存結構空間利用率高,而用鏈式儲存結構可以不用擔心空間的不足或浪費,二者各有優勢,但目前我用順序儲存結構更多。學了棧和佇列,許多問題的解決變得方便了許多,比如括號問題的求解,表...

DS部落格作業03 棧和佇列

6 3是否合法出入棧操作 1.初始化乙個字串和棧 字串用於存需要判斷的括號,棧用於匹配 2.將字串和棧作為形參傳入函式 3.進入函式,遍歷字串,所有屬於右邊括號的都進棧。遍歷到右括號的時候,用e訪問棧頂,並棧頂元素匹配,如果匹配成功flag 1 並且把棧頂出棧,方便進行下一符號匹配 如果匹配不成功就...