本算法摘選自啊哈磊所著的《啊哈!算法》第二章第二節的題目——使用棧來解密迴文。文中代碼使用C語言編寫,博主經過閱讀和理解,從新由Java代碼實現了一遍,意在深入理解棧這一數據結構的特性和操做方法,並但願可以在這種數據結構的幫助之下,解決其餘的相似的可以用棧來解決的問題。(哈哈,偷懶了,引用了上一篇博文的簡述)算法
迴文字符串就是正讀反讀均相同的字符串序列,好比「xyzyx」、「aha」、"ahaha"和「121」等等,如今要求你使用算法來判斷給定一個字符串是不是迴文字符串。數組
若是一個字符串是迴文的話,那麼它確定是中間對稱的,只須要將中間點之前的字符串反過來與中間點後面的字符串一一比較,若是都相等,那麼就是迴文字符串了,那麼如何可以將中間點前面的字符串依次讀入而後再反過來讀出呢,這個時候棧就上場了。數據結構
棧是一種後進先出的數據結構,只能在一端進行插入和刪除操做,就如同手槍彈夾同樣,裝子彈的時候老是在彈夾的異端塞入,並且最後裝入的那發子彈會最早打出,最早裝入的字段成了最後一發,彈夾的結構就相似於棧的原理結構。把迴文字符串順着放進棧中,可以倒着順序取出來,這恰好就知足了咱們的需求,棧的實現也很簡單,只須要一個一維數組和一個指向棧頂的指針(變量)top,咱們在插入或者刪除棧中數據時移動top指針就好了,這樣咱們就能很容易的接用棧這種數據結構來判斷字符串是不是迴文了,接下來咱們看具體的代碼實現。spa
1 public static void main(String[] args) { 2 // 假設一段字符串 3 String str = "xyzzyx"; 4 char[] cha = str.toCharArray(); 5 6 // 使用數組模擬棧 7 char[] stack = new char[10]; 8 9 // 求字符串的中點 10 int len = str.length(); 11 int mid = len / 2; 12 13 // 棧的開始位置 14 int top = 0; 15 16 // 將字符串的前半段依次入棧 17 for(int i = 0; i < mid; i++) { 18 stack[top] = cha[i]; 19 20 // 棧頂指針上移(下面的代碼能夠合入到上面一行,這裏爲方便理解) 21 top++; 22 } 23 24 // 判斷字符串長度是奇數仍是偶數,並決定須要匹配字符串開始下標 25 int next = (len & 1) == 0 ? mid : (mid + 1); 26 27 // 開始匹配 28 for(int j = next; j < len; j++) { 29 // 利用棧的原理,出棧順序的字符串和入棧順序是相反的,因此若是出棧順序和字符串後半段順序是一致的,則說明是迴文 30 if(cha[j] != stack[--top]) { 31 break; 32 } 33 } 34 35 // 若是top最後的值爲0,則說明棧內全部內容都匹配上了,結果就是迴文 36 if(top == 0) { 37 System.out.println("Yes, it is HW."); 38 }else { 39 System.out.println("No, it is not HW."); 40 } 41 }
棧的特性很容易理解就是後進先出(Last In First Out, LIFO),實現上只須要用一個一維數組和一個變量top封裝起來就好了,出棧和入棧的操做只須要移動棧頂指針即變量top便可,當變量top的值等於0時,則說明當前棧是一個空棧。堆棧的概念最先由Alan M.Turing(艾倫·圖靈)提出的,意在解決子程序的調用和返回,熟悉Java底層概念的同窗對此應該都有所瞭解吧。指針
一、《啊哈!算法》/ 啊哈磊著. 人民郵電出版社code