談談你對棧和隊列結構的認識及學習體會編程
這幾周學習了棧和隊列 棧的特色是先進後出,這種特色適合用來將中綴表達式轉爲後綴表達式,適合用來處理運算符的優先級,這些內容書上都有代碼,也有將思路,看着簡單,但是實際操做打起代碼來好像沒有想象的那麼簡單; 爲了最大化棧的利用空間,可使用共享棧來存儲數據,從兩邊分別進棧向中間伸展,共享棧要注意的是判斷棧空和棧滿的條件和普通棧不大同樣; 隊列的特色是先進先出,能夠用來處理報數問題之類的,並且有循環隊列的操做,這也是爲了充分利用隊列的空間 棧和隊列均可以用來處理迷宮問題,棧用的是深度搜索,找到路徑就中止搜索,搜索的速度雖然快可是不是最優解,而隊列用的是廣度搜索,所有的錄路徑都會被搜索到,雖然速度慢可是能夠找到最優解。 這也說明了棧和隊列都有各自的優勢,看利用在什麼問題上而已
進棧 先判斷是否棧滿 是,返回錯誤 不是,將數字賦給data的top位置,讓top++,返回正確 出棧 先判斷是否棧空 是,返回錯誤 不是,將數值賦給data的top減一的位置,並讓top--,返回數值
A1:一開始的部分正確是最小N,最後無輸出的測試點過了。由於忘記帶書回去了,因此也沒有看書,並且GetOp這個函數不大會寫,就只能本身瘋狂試探了,由於是另類堆棧,和書上的內容好像也不太同樣,加上我一直分不清,是應該先自增仍是後自增,提交列表就多了 Q1:後來開始打草稿了,由於一開始top爲0,因此進棧時,應該先賦值在自增,而後出棧時,由於進棧時,自增了一次,因此出棧的元素應該是top-1,而不是出棧top所在的元素,而後再那top自減,這樣就能夠正確了 A2:快接近正確時,而後又出現了部分正確,錯的測試點是格式錯誤 Q2:忘記加\n了!!
入隊 若是隊滿 是,返回錯誤 不是,將元素賦給data的(count+front)%MaxSize的位置,讓count自增,返回正確 出隊 若是隊空 是,返回錯誤 不是,將數值賦給data的front,讓front循環自增,count自減,返回數值
A1:編譯錯誤,好吧,又是一些低級錯誤,由於給的函數體有細節不表的函數,就沒有放到dev裏跑一下了 Q1:根據它給的編譯錯誤提示,輕鬆就解決了 A2:而後是部分正確,出隊和入隊均可以解決,可是最後將隊列輸出時,輸出的順序是錯的,由於輸出是調用出隊這個函數,因此也就沒改上一個進隊的函數,一直在研究出隊的函數,怎麼讓它輸出正確後來實在搞不定了,問了舍友才發現進隊函數寫的太簡單了,只讓count自增,對front都沒有操做到,這也致使了我輸出時的順序是有問題的 Q2:後來在舍友的幫助下,將代碼改了過來。後來本身看了書,發現書上有這個另類隊列的解法。好吧,我應該先看看書的!
定義字符串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 堆棧不爲空 將棧頂進隊,而且出棧 將隊列控制格式輸出
A1:這題是看着書上的代碼寫的思路差很少都懂,在dev上運行時,樣例時正確的,可是它提示格式錯誤,emmm,我明明有控制格式輸出 Q1:這道題目尚未解決,看看這個多種錯誤就知道了 A2:我發現輸入兩位數,它就會被拆開,因而我想變成int型的num再存入隊列,就能夠解決多位數的問題,可是我隊列和堆棧爲了放字符都是char型的,int型的num放不進去 A3:還有負數的問題,我想着在case ‘-’裏多加個判斷,可是也遇到了和多位數以上的麻煩,不知道怎麼連續放入同一個位置 A4:題目還有非整數的出現,意味着有小數點,這也是沒有考慮到的一個符號
while(隊列不空) count++ 出隊 入隊 if(count==m) 輸出隊頭 出隊 count初始化爲1 end if (控制格式忽略) end while
A1:編譯錯誤是個小意外,忘記改編譯器了 A2:部分正確是那個輸出錯誤的點過了,仍是pta好,能夠騙點分。。 Q2:這題的思路是遍歷隊列,而後出隊,再進隊,至關於第一數移到最後一個接着繼續報數,報到m的時候輸出並出隊再也不入隊,直到隊空就能夠了。一開始沒有想到這樣,就想着數到m出隊,沒有讓它循環數數,而後不是很懂咋整,而後又在舍友的提點下,有了這個思路
思路好像和書上的差很少,就是遇到數字進棧而後遇到運算符,將兩個數字出棧進行運算,將獲得的結果進棧,而後同理進行下去,可是當我運行時,發現不沒有獲得我想要的答案,因而我就開始調試,以例題爲例,一開始是56-20獲得36進棧,而後2+4=6,6進棧,最後讀到/號,應該是36/6,可是由於有空格的緣由,我將空格放在了default裏,數字也放在default裏,因而它再次將4+2的2讀了進去,因而變成了6/2,後來想把讀到空格另外挑出來,可是失敗了,代碼反反覆覆的改,到最後的提交仍是沒作出來。 裏面有個除數爲0的測試點,原本應該能夠偷點分,用了return 0;提示錯誤,用來exit(0)提示錯誤,用了goto也提示錯誤,emmm,我咋沒想到用return;佛了 測試點還有個負數的狀況,按照個人代碼的思路好像也沒考慮到負數的問題,也許我應該整段代碼從新寫一遍,從新整理一下思路
這題一開始的思路和那題比較簡單的符號配對思路同樣,用switch來考慮,可是遇到‘/*’就會比較麻煩,因而先遍歷整段代碼將要判斷的符號放進一個op數組裏,而後再遍歷op數組進行配對,遇到/*用‘z’進行標記,遇到‘*/’用‘y’進行標記。把左括號進棧,而後再看右括號,能配對的就將相應的左括號出棧,而後再判斷缺失的是左括號仍是右括號,理想很豐滿,現實很骨感,這段代碼仍是沒有實現這個功能,目前只能過一個測試點,代碼有待改進