Stack(栈)的简单应用——实现单词逆序

本文介绍了如何利用栈的后进先出特性实现字符串的逆序排列,通过创建StackX类并配合MyStringBuffer类,实现了与java.lang.StringBuffer.reverse()相同的功能,详细展示了代码实现过程。

       java.lang.StringBuffer类中有一个reverse()方法,此reverse()方法的作用是将一个字符串逆序排列,那么此方法究竟是如何做到的呢?
       学习过数据结构的人都知道,栈(Stack)的特性是后进先出,即最先存储到栈中的元素位于栈底,最后存储到栈中的元素位于栈顶,从栈中取出数据时,最先取出来的都是栈顶的元素,因此可以利用栈的这种特性实现单词逆序,下面是我使用栈来实现的将一个单词逆序的相关代码,实现的功能与 java.lang.StringBuffer类中有一个reverse()方法一模一样

Code:
  1. package datastructures.practise.stackandqueue;   
  2.   
  3. public class ReverseApp {   
  4.   
  5.     public static void main(String[] args) {   
  6.   
  7.         // StringBuffer类中reverse()方法实现的功能为将字符串HelloWorld逆序排列成dlroWolleH   
  8.         StringBuffer sbuffer = new StringBuffer("HelloWorld");   
  9.         System.out.println(sbuffer.reverse());// 输出的结果为:dlroWolleH   
  10.   
  11.         // 实现与 StringBuffer类中reverse()方法一样的功能   
  12.         MyStringBuffer rv = new MyStringBuffer("HelloWorld");   
  13.         System.out.println(rv.reverse());// 输出的结果为:dlroWolleH   
  14.   
  15.     }   
  16.   
  17. }   
  18.   
  19. /**  
  20.  * 定义一个栈类,此栈是用来作为字符串分解为一个个字符时的临时存储的数据结构  
  21.  *   
  22.  * @author 孤傲苍狼  
  23.  *   
  24.  */  
  25. class StackX {   
  26.   
  27.     private int maxSize;   
  28.     private char[] stackArray;   
  29.     private int stackTop;   
  30.   
  31.     // ----------------------------------------------------------   
  32.     // 构造方法   
  33.     public StackX(int s) {   
  34.         maxSize = s;   
  35.         stackArray = new char[maxSize];   
  36.         stackTop = -1;   
  37.     }   
  38.   
  39.     // ----------------------------------------------------------   
  40.     // 此方法是用来将一个字符存储到栈中   
  41.     public void push(char c) {   
  42.         stackArray[++stackTop] = c;   
  43.     }   
  44.   
  45.     // 此方法是用来从栈中取出一个字符   
  46.     public char pup() {   
  47.         return stackArray[stackTop--];   
  48.     }   
  49.   
  50.     // 此方法是用来查看位于栈顶的元素   
  51.     public char peek() {   
  52.         return stackArray[stackTop];   
  53.     }   
  54.   
  55.     // 此方法是用来判断栈的存储空间是否已经满   
  56.     public boolean isFull() {   
  57.         return (stackTop == maxSize - 1);   
  58.     }   
  59.   
  60.     // 此方法是用来判断栈是否已经清空   
  61.     public boolean ifEmpty() {   
  62.         return (stackTop == -1);   
  63.     }   
  64. }   
  65.   
  66. class MyStringBuffer {   
  67.     private String input; // 输入的字符串   
  68.     private String output; // 反转输出后的字符串   
  69.   
  70.     // ---------------------------------------------------------   
  71.     public MyStringBuffer(String input) {   
  72.         this.input = input;   
  73.     }   
  74.   
  75.     /**  
  76.      * 此方法用来完成将一个字符串逆序排列  
  77.      *   
  78.      * @return  
  79.      */  
  80.     public String reverse() {   
  81.         int stackSize = input.length();// 得到字符串的长度   
  82.         StackX stack = new StackX(stackSize);// 根据字符串的长度确定栈数组的长度   
  83.         for (int i = 0; i < input.length(); i++) {   
  84.             char ch = input.charAt(i);// 循环取出字符串中的每一个字符   
  85.             System.out.println("当i=" + i + "时,取出的字符是:" + ch);   
  86.             stack.push(ch);// 把字符串分解成一个个字符存储到栈中   
  87.             System.out.println("存储到栈中的第" + (i + 1) + "个字符是:" + ch);   
  88.         }   
  89.   
  90.         output = "";   
  91.         for (int i = 0; i < stackSize; i++) {   
  92.             char c = stack.pup();// 根据栈后进先出的特性,这里取出来的第一个字符将是最后加入到栈中的字符   
  93.             System.out.println("从栈中取出来的第" + (i + 1) + "个字符是:" + c);   
  94.             output += c;   
  95.             System.out.println("此时的output=" + output);   
  96.         }   
  97.   
  98.         return output;   
  99.     }   
  100. }   

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值