算法学习--栈的小应用

学习了栈的内容,今天实在有点懒得写了啊!
可能总会是这样,不过今天读了一个书,上面简单说就是如果你能看到未来努力的结果才能慢慢进行推进!

今天主要学习了栈的简单应用,不过确实是有收获,原来确实不知道栈是干嘛用的,不过通过书上的一番教导。
稍微明白了一点,一天进步一点以后希望晚上可以 进行总结一下啦!


栈可以处理回文的问题例如aba 这样的数字是回文,但是如何进行比对呢?利用栈就很方便解决啦!
将每个字母进行入栈操作(一半哦) 然后再进行出栈的操作就ok了!

看来这个很重要哦!

哈哈哈 算法嘛~ 现在突然意识到 选择一个好的数据结构才能快速的完成一定的工作呢!
加油!

主要的就是对奇数偶数的判断啦!
书上也说,这个数据结构是图灵大师,创造的!当时为了去解决一个函数的子调用的问题,感觉确实是啊! 这个解决这个问题再好不过了。
突然想起原来我的一个前辈,用栈的模型,进行多数据源的分库分表! 厉害!

package arithmetic.chapter2;

/**
 * 栈相当于一个只能从后面插入取出的一个队列,可以用一个数组进行描述,这个数组添加的时候添加到末尾,
 * 取出的时候也只能从末未进行取出,这样一个栈的雏形就出来了,
 * 生活中很多都是栈的应用,例如手电筒放电池什么的,先放入的电池后拿出来.
 *
 * 栈可以用来处理回文的问题,什么是回文呢?
 * 就是 例如 ababababa 这样就算是回文的问题啦!
 *
 * 之前我还看到一个算法题,是关于这个问题的,哎呦,我这还一通算啊! 慢慢理解到 数据结构的意义是什么,一个良好的数据结构可以解决很多问题!
 * 深刻!
 *
 * 栈 主要包含以下几个元素!
 * 1.栈的主体队列(也就是一个数组)
 * 2.栈顶指针,当然这个指针一直指向的栈顶的元素,栈顶是默认没有的
 *
 */
public class Stack {
    public static void main(String[] args){
        long startTime = System.currentTimeMillis();
        System.out.println("main 方法开始");

        String palindrome = "abcdefedcba";
//        String palindrome = "aba";

        System.out.println(getPalindromeAfter(palindrome));


        System.out.println("main 方法结束 耗时:" + (System.currentTimeMillis() - startTime) +" ms!");
    }

    public static int getMid(char[] chars){
        // 偶数 这个中间数 是 数组选取的入栈出栈的零界点
        // aba = 3 3/2 = 1  ab =1
        if(chars.length%2 == 0){
            return chars.length /2;
        }else{
            return chars.length /2;
        }
    }

    /**
     * 自己想的写法
     * @param palindromeStr
     * @return
     */
    public static boolean getPalindrome(String palindromeStr){
        char[] chars = palindromeStr.toCharArray();
        int index = getMid(chars);
        char[] stack = new char[20];
        int stackTop = 0;
        for(int i =0;i<index;i++,stackTop++){
            stack[i] = chars[i];
        }
        // 如果是 奇数则应该冲中位数的下一个数字开始比较
        if(chars.length %2 != 0){
            index++;
        }
        for(stackTop=stackTop-1;stackTop>=0;stackTop--){
            if(stack[stackTop] != chars[index]){
                System.out.println(stack[stackTop]+" : "+ chars[index]);
                break;
            }
            System.out.println(stack[stackTop]+" : "+ chars[index]);
            index++;
        }

        if(stackTop == -1){
            return true;
        }else{
            return false;
        }
    }

    /**********************************看书以后的*************************************/
    /**
     * 看书以后的,因为在之前如果数组是从0开始的时候会遇到很多问题,例如栈顶元素判断的时候栈的最后一个位置需要进行多一次判断,以至于需要判断
     * 最后的stackTop是不是-1 这样显然是不符合逻辑的
     * @param palindromeStr
     * @return
     */
    public static boolean getPalindromeAfter(String palindromeStr){
        char[] chars = palindromeStr.toCharArray();
        int mid = chars.length/2;
        char[] stack = new char[20];
        int stackTop = 0;

        for (int i = 0; i < mid; i++) {
            stack[++stackTop] = chars[i]; // 经常写错 把后面的chars 变成 stack
        }

        if((chars.length/2) %2 != 0){
            mid++;
        }

        for(;stackTop >0;stackTop--,mid++){
            System.out.println(stack[stackTop]+" : "+ chars[mid]);
            if(stack[stackTop] != chars[mid]){
                break;
            }
        }

        if(stackTop == 0){
            return true;
        }else{
            return false;
        }

    }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值