经典数据结构系列之:栈的应用

1、前言

数据结构,是计算机编程中对数据存储最基本的操作,不同的数据结构适用不同的业务场景。如今大部分情况都是调用开发API封装好的类库,直接调用,几乎不需要程序员再去深究其中背后实现的逻辑,大大简化和减低了对程序员的要求。正是这种,知其然而不知其所以然,导致很多程序员缺乏对于底层结构的了解,分不清楚不同数据结构之间的性能差异,导致出现很多系统性能问题。

2、原理推导

栈的运用,栈是一种特殊的线性表(线性表是一种顺序表,一种线性结构序列。),只能在表的顶端进行删除或插入操作,遵循"后进先出"(FILO)原则。

利用栈的特性,实现字符串倒序: "hello world!"

实现字符串倒序的方法有很多,比如,我们常用的循环实现倒序。

 public void reverseString(String str) {
        char[] chr = str.toCharArray();
        for (int i = chr.length - 1; i >= 0; i--) {
            System.out.print(chr[i]);
        }
    }

利用栈来实现这个倒序的案例,可以很好的把栈的思想和实现方式完整的体现出来。

#步骤说明

1.将字符串按照char类型转换
2.将字符依次入栈
3.将字符依次从栈中取出,构成倒序之后的字符串

3、代码示例

# 栈的基本操作服务类


/**
 * 栈的基本实现
 */
public class StackService {

   private char[] stackDatas; //用一维数组存储栈的数据
   private int topIndex = -1;

    public StackService(int length){
        stackDatas = new char[length];
    }

    /**
     * 数据入栈,先入栈的数据后出
     * @param data
     */
   public void stackPush(char data){
       topIndex++;
       stackDatas[topIndex] = data;
   }

    /**
     *  数据出栈,后入栈的数据先出
     * @return
     */
   public char stackPop(){
       char data = stackDatas[topIndex];
       topIndex--;
       return data;
   }

    /**
     *  查询当前栈顶数据
     * @return
     */
   public char stackPeek(){
       return  stackDatas[topIndex];
   }

    /**
     * 栈内数据是否已经清空
     * @return
     */
   public boolean isEmpyt(){
        return topIndex == -1;
   }

    /**
     * 打印栈内数据
     */
   public void printStack(){
       System.out.println("-----思维的持续-----");
       for (int i=0;i<topIndex;i++){
           System.out.println(stackDatas[i]);
       }
   }

}

# 利用栈完成对字符串“hello world!”的倒序实现类

/**
 * 使用栈完成字符的倒序
 */
public class StackReverse {

    public String charsReverse(String data){
        StackService stackService = new StackService(20);
        StringBuffer stringBuffer = new StringBuffer();

        //1.将字符串按照char类型转换
        char [] dataChars = data.toCharArray();

        //2.将字符依次入栈
        for (char c: dataChars) {
            stackService.stackPush(c);
        }

        //3.将字符依次从栈中取出,构成倒序之后的字符串
        while (!stackService.isEmpyt()){
            stringBuffer.append(stackService.stackPop());
        }

        return stringBuffer.toString();
    }

    public static void main(String[] args) {
        String reverseStr = "hello world!";
        StackReverse stackReverse = new StackReverse();
        
        System.out.println("-----正序-----:"+reverseStr);
        String  reverseResult = stackReverse.charsReverse(reverseStr);
        System.out.println("-----倒序-----:"+reverseResult);
    }

}

4、禅定时刻

栈的运用,主要是利用栈先入后出的特性,解决实际业务场景中需要的解决方案,在操作系统和虚拟机实现上都广泛的使用了栈的实现,得益于栈的的时间复杂度都是常数O(1),没有移动和复制上的开销。

猜你喜欢

转载自www.cnblogs.com/swdcx/p/12516498.html