本算法摘选自啊哈磊所著的《啊哈!算法》第二章第二节的题目——使用栈来解密回文。文中代码使用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