Java数据结构--栈--0基础入门(一)

本文介绍了栈这一数据结构的基础概念及其实现方式,并通过具体示例演示了如何使用栈解决实际问题,如判断一个字符串是否为回文。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先了解一下原理

栈是限制插入和删除只能在一个位置上进行的线性表。其中,允许插入和删除的一端位于表的末端,叫做栈顶(top),不允许插入和删除的另一端叫做栈底(bottom)。对栈的基本操作有 PUSH(压栈)和 POP (出栈),前者相当于表的插入操作(向栈顶插入一个元素),后者则是删除操作(删除一个栈顶元素)。栈是一种后进先出(LIFO)的数据结构,最先被删除的是最近压栈的元素。


 主要有两种方式,链表实现和数组实现。

来写一个代码 模拟入栈出栈

public class ArrayStack {
    //定义栈的大小为10,top=-1代表栈目前没有元素
    private int maxStack;
    private int top = -1;
    //用数组来模拟栈
    private int[] stack;

    /**
     * 初始化栈
     * @param maxStack 栈的大小
     */
    public ArrayStack(int maxStack) {
        this.maxStack = maxStack;
        this.stack = new int[this.maxStack];
    }

    /**
     * 入栈
     */
    public void push(int value){
        if (isFull()) {
            throw new RuntimeException("栈已满");
        }
        top++;
        stack[top] = value;
    }

    /**
     * 出栈
     */
    public int pop(){
        if (isEmpty()) {
            throw new NullPointerException("栈已空");
        }
        int value = stack[top];
        top--;
        return value;
    }

    /**
     * 判断是否为空
     * @return
     */
    public boolean isEmpty(){
        return this.top == -1;
    }

    /**
     * 判断是否满栈
     * @return
     */
    public boolean isFull(){
        return this.top == maxStack-1;
    }

    /**
     * 查看栈中数据
     */
    public void list(){
        if (isEmpty()){
           throw new NullPointerException("空栈");
        }
        for (int i = 0; i < top+1; i++) {
            System.out.print(stack[i]+",");
        }
    }
}

来个Test类测试一下


接下来我们来几个小应用

回文: 一个单词、短语或数字,从前往后写和从后往前写都是一样的。比如,单词“dad”、“racecar”就是回文

 思路:我们将拿到的字符串的每个字符按从左至右的顺序压入栈。当字符串中的字符都入栈后,栈内就保存了一个反转后的字符串,最后的字符在栈顶,第一个字符在栈底 

那我们怎么入栈出栈进行对比呢

 charcharAt(int index)
          返回指定索引处的 char 值。

我们还要在ArrayStackTest.java中写一个

/**
     * 输出数组元素个数
     */
    public int length(){
        return this.top+1;
    }

这个很重要,在pop()方法中,top一直在变化,top--。所以用val.length不行

这个我在代码里也会备注一下,我们直接上代码

public class ArrayStackTest02 {
    public static void main(String[] args) {
        System.out.println(judement("raar"));
    }

    /**
     * 判断回文数
     * @param val 传入字符串
     * @return
     */
    public static boolean judement(String val){
        //初始化栈的大小,以便创建对象
        ArrayStack arrayStack1 = new ArrayStack(10);

        /**
         * 入栈
         */
        for (int i = 0; i < val.length(); i++) {
            arrayStack1.push(val.charAt(i));
        }

        /**
         * 出栈
         */
        String newVal = "";
        //最关键的一步,length放在for循环中,在pop方法中会top--,先提取出来
        int length = arrayStack1.length();
        for (int i = 0; i < length; i++) {
            if (!arrayStack1.isEmpty()) {
                //返回的是int类型,需要转型
                char val1 = (char)arrayStack1.pop();
                newVal = newVal + val1;
            }
        }

        if (newVal.equals(val)) {
            return true;
        }
        return false;
    }
}

当然我们还可以加上用户输入输出功能,显得系统更完善

再来个例子放在下一篇文章讲,都会放在专栏里面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值