1.本週學習總結
- 1. 感受棧和隊列難度很大,特別是表達式求值還有符號配對,這真心很困難,打PTA打的特別心塞,都不會啊,並且編程量大,須要考慮的東西不少,光是看書就看得頭暈,看了好久纔會懂點,好在有老師介紹的容易,經過兩個頭文件#include
和#include
兩個頭文件,接下去再進行入棧出棧入隊出隊操做時候會方便些,可是仍是得細心些,好比top和pop的區別,一個只取棧頂不去棧頂,另外一個則相反
- 2. 一開始老師剛講棧時候...我一直把棧聽成...寨...。棧是遵循「先進後出」原則,並且進出棧只能是從棧頂進行操做,隊列和棧有點不同,隊列就像現實生活中的排隊,從隊頭出隊,從隊尾進入,符合先進後出原則。二者都做爲線性結構,有着異同點,棧和隊列二者在進行插入和刪除上時間複雜度都是O(1),在空間複雜度上二者也同樣,插入的操做都被限制在棧頂或者隊尾也就是尾部。二者不一樣於刪除元素的位置不一樣,棧的刪除在棧頂,隊列的刪除則在隊頭。還有應用場景的不一樣:棧用於括號問題還有表達式的轉換和求值,深度搜索,函數的調用和遞歸等。而隊列用於計算機系統中各類資源的管理,消息緩衝器和廣度優先搜索等等
2.PTA實驗做業
2.1.題目1:6-2 在一個數組中實現兩個堆棧
本題要求在一個數組中實現兩個堆棧。
2.1.2代碼截圖
2.1.3本題PTA提交列表說明。
- Q1:一開始各類錯誤,主要是段錯誤和答案錯誤,代碼思惟上...好像是沒錯的
- A1:我初始化棧時候,將兩個棧的Top分別置爲0和1,而後也沒注意看懂題目的意思,覺得兩個棧是是以奇數偶數來區別,就以這種形式來初始化棧,還連空棧,棧滿狀況的條件考慮得好好的
- Q2:後來舍友跟我說,書本上有代碼,我就看着書本打一遍代碼,而後仍是有錯,只不過全變成輸出超限這個錯誤
- A2:這輸出超限是由於我棧滿條件的判斷錯誤,我一開始覺得棧滿的條件是Top1等於Top2,這樣子錯誤了,若是真的這樣子的話他們就會有個空間進行重複了,而正確的棧滿判斷條件應該是Top1是等於Top2減一,這樣子才正確
- Q3:改進了棧滿條件後,再提交PTA後仍是輸出超限的問題,棧空的判斷條件我也錯了
- A3:棧空條件我覺得是隻要任何一個爲棧空的狀況,都得返回ERROR,因此其實這樣談房子棧空狀況下他仍是繼續進行操做,後來我改進代碼,在判斷條件爲空狀況下,將他們分開來判斷,
2.2.題目2:6-12 jmu-ds-舞伴問題
假設在週末舞會上,男士和女士們分別進入舞廳,各自排成一隊。跳舞開始,依次從男隊和女隊隊頭各出一人配成舞伴,若兩隊初始人數不一樣,則較長那一隊未配對者等待下一輪舞曲。現要求寫一算法模擬上述舞伴配對問題。 你須要用隊列操做實現上述算法。請完成下面5個函數的操做。
2.2.2代碼截圖
這道題只提交這三個函數 PTA也能過得去
算法
2.2.3本題PTA提交列表說明。
- Q1:一開始答案和PTA的正確答案差了一格 就是跳過了張1 王2 直接輸出林1 薛2
- A1:我在將女性的姓名每個字符存進去的for循環中,我還將rear隊尾每次都給自增了,致使他最後輸出錯誤答案。後來的編譯錯誤是由於我不注意在cout中又加了個cout,致使編譯錯誤,還有原本想用C語言中的賦值函數,沒想到頭文件中沒有string
- Q2:在多種錯誤中,有運行超時和答案錯誤
- A2:在輸出舞伴的while循環中,我判斷條件爲i小於等於人數少的那個,這樣就致使輸出超時了,由於隊列中最多含有(MAXSIZE-1)個元素,在臨界條件下他就沒有相應的數來輸出,才致使錯誤,格式錯誤是由於題目要求兩個空格來隔開,可我只用一個空格
2.3.題目3:7-2 jmu-ds-符號配對
假設表達式中容許包含3種括號:圓括號、方括號和大括號。即(,[,'{'。編寫一個算法判斷表達式中的括號是否正確配對, 要求利用棧的結構實現。
2.3.1設計思路
先遍歷字符串str,遇到左括號就入棧st,碰到右括號就先判斷棧st是否爲空,棧空則證實缺乏左符號返回false,若是棧不空則取棧頂字符於e,若是不匹配右符號則將flag置爲0。遍歷完字符串,若是此時棧空而且flag爲1,則返回true,不爲空則按要求操做
2.3.2代碼截圖
2.3.3本題PTA提交列表說明。
- Q1:一開始有個多種錯誤,裏面有段錯誤還有答案錯誤
- A1:我最後判斷棧空的條件時候,忘記若是棧空的話返回的是1而棧不空返回的則是0,我就用!st.empty()來判斷棧空,致使了錯誤
- Q2:後面還有五分沒能拿到,錯誤爲括號不匹配 棧空的測試點過不去
- A2:在遇到右符號時候,忘記了得先判斷棧是否爲空,棧空則錯誤則返回
2.3.題目4:7-6 銀行業務隊列簡單模擬
設某銀行有A、B兩個業務窗口,且處理業務的速度不同,其中A窗口處理速度是B窗口的2倍 —— 即當A窗口每處理完2個顧客時,B窗口處理完1個顧客。給定到達銀行的顧客序列,請按業務完成的順序輸出顧客序列。假定不考慮顧客前後到達的時間間隔,而且當不一樣窗口同時處理完2個顧客時,A窗口顧客優先輸出。
2.3.1設計思路
定義數組a來存放輸入的數,經過sum來記錄下奇數的最後一個數的位置,遍歷整個數組,若是爲奇數輸出,還有控制空格的輸出,k自增來計算奇數有幾個 ,若是是偶數則入隊列,判斷k是否等於2或者i大於sum值 若是知足其一,再判斷sum值是否等於初值,是則輸出隊頭並將sum置爲-2 不然控制輸出 並將k從新計數
2.3.2代碼截圖
2.3.3本題PTA提交列表說明。
- Q1:一開始答案錯誤,一份也沒有,還有後面只過了個測試點得了十五分
- A1:起初忘記了每次輸出完k要置爲0,致使錯誤,然後面輸出的判斷條件少了一句,i大於sum的狀況,也就是k不等於2狀況下 但還有數沒輸出
- Q2:還有些編譯錯誤,那是粗心形成的
- A2:判斷條件中由於括號有點多,因此少加了個括號,也沒去注意就直接提交PTA致使編譯錯誤
三、棧和隊列上機考試
3.1.1 題目 6-2 jmu-ds-舞伴問題
假設在週末舞會上,男士和女士們分別進入舞廳,各自排成一隊。跳舞開始,依次從男隊和女隊隊頭各出一人配成舞伴,若兩隊初始人數不一樣,則較長那一隊未配對者等待下一輪舞曲。現要求寫一算法模擬上述舞伴配對問題。 你須要用隊列操做實現上述算法。請完成下面5個函數的操做。
3.1.2 代碼截圖
3.1.3 錯誤緣由 :
這是編譯錯誤 我忘記了這是個void型的函數 還打算return個值 把這條刪掉就能夠了
答案錯誤 在輸出的函數內 只將某一個隊頭給自增,另一個沒自增,致使輸出錯誤,這沒考試前我也有這樣錯誤過...
3.2.1 題目 6-3 jmu-ds-表達式求解
輸入一個後綴表達式,程序求出表達式值
3.2.2 代碼截圖
3.2.3
錯誤緣由 :編程
再存十位數的時候出錯了,第一個不能進去再存進去,並且還要先出棧,再將這個十位數存進去
改進代碼
![](https://img2018.cnblogs.com/blog/1474614/201904/1474614-20190421213359737-1145915857.png)
錯誤緣由 :
再判斷除數爲0的狀況錯了,把除數和被除數搞混了數組
```
改進代碼
函數
3.4 學習體會
- 1. 上機考仍是難度大,有些題目是PTA原題打的時候仍是會一腦子懵逼,還有運用容器會簡單點,取棧頂去棧頂會方便容易點
- 2.有些時候得考慮詳細點,有時候就是細節問題,好比表達式求值這一題,應考慮到被除數爲0狀況的提示和排除,當遇到運算符號時,要出棧兩個數,打得仍是不夠熟練,原題仍是會出錯