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

1.本週學習總結(0--1分)

談談你對棧和隊列結構的認識及學習體會編程

這幾周學習了棧和隊列
棧的特色是先進後出,這種特色適合用來將中綴表達式轉爲後綴表達式,適合用來處理運算符的優先級,這些內容書上都有代碼,也有將思路,看着簡單,但是實際操做打起代碼來好像沒有想象的那麼簡單;
爲了最大化棧的利用空間,可使用共享棧來存儲數據,從兩邊分別進棧向中間伸展,共享棧要注意的是判斷棧空和棧滿的條件和普通棧不大同樣;
隊列的特色是先進先出,能夠用來處理報數問題之類的,並且有循環隊列的操做,這也是爲了充分利用隊列的空間
棧和隊列均可以用來處理迷宮問題,棧用的是深度搜索,找到路徑就中止搜索,搜索的速度雖然快可是不是最優解,而隊列用的是廣度搜索,所有的錄路徑都會被搜索到,雖然速度慢可是能夠找到最優解。
這也說明了棧和隊列都有各自的優勢,看利用在什麼問題上而已

2.PTA實驗做業

2.1.題目1:6-1 另類堆棧(函數題)

2.1.1設計思路

進棧
    先判斷是否棧滿
        是,返回錯誤
        不是,將數字賦給data的top位置,讓top++,返回正確
出棧
    先判斷是否棧空
        是,返回錯誤
        不是,將數值賦給data的top減一的位置,並讓top--,返回數值

2.1.2代碼截圖

2.1.3本題PTA提交列表說明

A1:一開始的部分正確是最小N,最後無輸出的測試點過了。由於忘記帶書回去了,因此也沒有看書,並且GetOp這個函數不大會寫,就只能本身瘋狂試探了,由於是另類堆棧,和書上的內容好像也不太同樣,加上我一直分不清,是應該先自增仍是後自增,提交列表就多了
Q1:後來開始打草稿了,由於一開始top爲0,因此進棧時,應該先賦值在自增,而後出棧時,由於進棧時,自增了一次,因此出棧的元素應該是top-1,而不是出棧top所在的元素,而後再那top自減,這樣就能夠正確了
A2:快接近正確時,而後又出現了部分正確,錯的測試點是格式錯誤
Q2:忘記加\n了!!

2.2 題目2:6-11 另類循環隊列(函數題)

2.2.1設計思路

入隊
    若是隊滿
        是,返回錯誤
        不是,將元素賦給data的(count+front)%MaxSize的位置,讓count自增,返回正確
出隊
    若是隊空
        是,返回錯誤
        不是,將數值賦給data的front,讓front循環自增,count自減,返回數值

2.2.2代碼截圖

2.2.3本題PTA提交列表說明

A1:編譯錯誤,好吧,又是一些低級錯誤,由於給的函數體有細節不表的函數,就沒有放到dev裏跑一下了
Q1:根據它給的編譯錯誤提示,輕鬆就解決了
A2:而後是部分正確,出隊和入隊均可以解決,可是最後將隊列輸出時,輸出的順序是錯的,由於輸出是調用出隊這個函數,因此也就沒改上一個進隊的函數,一直在研究出隊的函數,怎麼讓它輸出正確後來實在搞不定了,問了舍友才發現進隊函數寫的太簡單了,只讓count自增,對front都沒有操做到,這也致使了我輸出時的順序是有問題的
Q2:後來在舍友的幫助下,將代碼改了過來。後來本身看了書,發現書上有這個另類隊列的解法。好吧,我應該先看看書的!

2.3 題目3:7-4 表達式轉換(編程題)

2.3.1設計思路

定義字符串exp,char型的堆棧,char型的隊列,變量i,j
輸入字符串exp
遍歷exp
    switch(exp)
       case ‘+’,case '-':
            while 堆棧不空
                if 棧頂不是左括號//由於不是左括號,優先級就比較低,放進隊列裏等待被輸出
                    將棧頂進隊,而且出棧
                else break;
            end while
            將exp[i]進棧,i++,break
        case ‘*’,case ‘/’:
            while 堆棧不空
                if 棧頂不是*或者/
                    將棧頂進隊,而且出棧
                else break;
            end while
            將exp[i]進棧,i++,break
        case ‘(’:
            將左括號進棧//遍歷堆棧時遇到左括號,其後面的運算符的優先級就比較高,能夠先進隊
            i++,break
        case ‘)’:
            當棧頂不爲‘(’
                將棧頂進隊,出棧
            將棧頂出棧//這個時候棧頂爲左括號,應該將其出棧
            i++,break
        default:
            while exp[i]爲數字字符,將其進隊,i++,break
    end while
while 堆棧不爲空
    將棧頂進隊,而且出棧
將隊列控制格式輸出

2.3.2代碼截圖



2.3.3本題PTA提交列表說明


A1:這題是看着書上的代碼寫的思路差很少都懂,在dev上運行時,樣例時正確的,可是它提示格式錯誤,emmm,我明明有控制格式輸出
Q1:這道題目尚未解決,看看這個多種錯誤就知道了
A2:我發現輸入兩位數,它就會被拆開,因而我想變成int型的num再存入隊列,就能夠解決多位數的問題,可是我隊列和堆棧爲了放字符都是char型的,int型的num放不進去
A3:還有負數的問題,我想着在case ‘-’裏多加個判斷,可是也遇到了和多位數以上的麻煩,不知道怎麼連續放入同一個位置
A4:題目還有非整數的出現,意味着有小數點,這也是沒有考慮到的一個符號

2.4 題目4:7-5 jmu-報數遊戲(編程題)

2.4.1設計思路

while(隊列不空)
    count++
    出隊
    入隊
    if(count==m)
        輸出隊頭
        出隊
        count初始化爲1
    end if
(控制格式忽略)
end while

2.4.2代碼截圖


2.4.3本題PTA提交列表說明

A1:編譯錯誤是個小意外,忘記改編譯器了
A2:部分正確是那個輸出錯誤的點過了,仍是pta好,能夠騙點分。。
Q2:這題的思路是遍歷隊列,而後出隊,再進隊,至關於第一數移到最後一個接着繼續報數,報到m的時候輸出並出隊再也不入隊,直到隊空就能夠了。一開始沒有想到這樣,就想着數到m出隊,沒有讓它循環數數,而後不是很懂咋整,而後又在舍友的提點下,有了這個思路

三、棧和隊列上機考試

3.1題目1:6-3 jmu-ds-表達式求解

3.1.1代碼截圖



3.1.2錯誤分析

思路好像和書上的差很少,就是遇到數字進棧而後遇到運算符,將兩個數字出棧進行運算,將獲得的結果進棧,而後同理進行下去,可是當我運行時,發現不沒有獲得我想要的答案,因而我就開始調試,以例題爲例,一開始是56-20獲得36進棧,而後2+4=6,6進棧,最後讀到/號,應該是36/6,可是由於有空格的緣由,我將空格放在了default裏,數字也放在default裏,因而它再次將4+2的2讀了進去,因而變成了6/2,後來想把讀到空格另外挑出來,可是失敗了,代碼反反覆覆的改,到最後的提交仍是沒作出來。
裏面有個除數爲0的測試點,原本應該能夠偷點分,用了return 0;提示錯誤,用來exit(0)提示錯誤,用了goto也提示錯誤,emmm,我咋沒想到用return;佛了
測試點還有個負數的狀況,按照個人代碼的思路好像也沒考慮到負數的問題,也許我應該整段代碼從新寫一遍,從新整理一下思路

3.2題目2:jmu-ds-符號配對




3.2.2錯誤分析

這題一開始的思路和那題比較簡單的符號配對思路同樣,用switch來考慮,可是遇到‘/*’就會比較麻煩,因而先遍歷整段代碼將要判斷的符號放進一個op數組裏,而後再遍歷op數組進行配對,遇到/*用‘z’進行標記,遇到‘*/’用‘y’進行標記。把左括號進棧,而後再看右括號,能配對的就將相應的左括號出棧,而後再判斷缺失的是左括號仍是右括號,理想很豐滿,現實很骨感,這段代碼仍是沒有實現這個功能,目前只能過一個測試點,代碼有待改進
相關文章
相關標籤/搜索