顺序栈(JAVA)

本文介绍了如何使用Java数组来实现顺序栈。重点讲述了入栈和出栈的操作,以及顺序栈的代码实现,最后给出了执行结果。

顺序栈就是基于数组的栈

数组实现栈的思路

栈有两个主要功能,入栈和出栈
数组定长后习惯从index=0开始向后遍历操作。那么可以以数组的头index=0处作为栈底,而index=length-1为最大栈顶位置。如果定义一个字段stackSize作为当前栈的实际存储元素个数,那么入栈就是在数组的index=stackSize放入元素,出栈就是在数组的index=stackSize-1取出元素。
数组和顺序栈

顺序栈的代码

import java.util.Arrays;

public class ArrayStack<T> {

    private T[] array;

    private int arrayLength;

    private int stackSize;

    public ArrayStack(int length) {
        this.arrayLength = length;
        this.array = (T[]) new Object[length];
    }

    public boolean push(T element) {
        if (arrayLength == stackSize) {
            System.out.println("stack is full");
            return false;
        }
        array[stackSize++] = element;
        return true;
    }

    public T pop() {
        if (stackSize == 0) {
            return null;
        }
        return array[--stackSize];
    }

    @Override
    public String toString() {
        T[] printArray = Arrays.copyOf(array, stackSize);
        return "arrayStack" + Arrays.toString(printArray);
    }

    public static void main(String[] args) {
        ArrayStack<String> stack = new ArrayStack<>(7);
        System.out.println(stack);
        stack.push("A");
        System.out.println(stack);
        stack.push("B");
        System.out.println(stack);
        stack.push("A");
        System.out.println(stack);
        stack.push("B");
        System.out.println(stack);
        stack.push("A");
        System.out.println(stack);
        stack.push("B");
        System.out.println(stack);
        stack.push("A");
        System.out.println(stack);
        stack.push("B");
        System.out.println(stack);
        stack.push("A");
        System.out.println(stack);
        stack.push("B");
        System.out.println(stack);
        stack.push("A");
        System.out.println(stack);
        stack.push("B");
        System.out.println(stack);
        stack.pop();
        System.out.println(stack);
        stack.pop();
        System.out.println(stack);
        stack.pop();
        System.out.println(stack);
        stack.pop();
        System.out.println(stack);
        stack.push("C");
        System.out.println(stack);
        stack.push("C");
        System.out.println(stack);
    }
}

执行结果

arrayStack[]
arrayStack[A]
arrayStack[A, B]
arrayStack[A, B, A]
arrayStack[A, B, A, B]
arrayStack[A, B, A, B, A]
arrayStack[A, B, A, B, A, B]
arrayStack[A, B, A, B, A, B, A]
stack is full
arrayStack[A, B, A, B, A, B, A]
stack is full
arrayStack[A, B, A, B, A, B, A]
stack is full
arrayStack[A, B, A, B, A, B, A]
stack is full
arrayStack[A, B, A, B, A, B, A]
stack is full
arrayStack[A, B, A, B, A, B, A]
arrayStack[A, B, A, B, A, B]
arrayStack[A, B, A, B, A]
arrayStack[A, B, A, B]
arrayStack[A, B, A]
arrayStack[A, B, A, C]
arrayStack[A, B, A, C, C]
Java顺序栈使用顺序存储结构实现,下面从实现和使用方法两方面介绍: ### 实现 #### 实现思路 使用组存储中的元素,用一个变量`top`指向顶元素的下标。初始时,`top`为 -1,表示为空。当有元素入时,`top`加 1,并将元素存储在组对应位置;出时,先检查是否为空,若不为空,返回`top`位置的元素,并将`top`减 1 [^1]。 #### 实现代码 ```java import java.util.Arrays; // 定义顺序栈类 class ShunxuStack implements IStack { Object[] objArray; int top = -1; // 指向顶元素所在下标 // 构造函,初始化的容量 public ShunxuStack(int i) { objArray = new Object[i]; } // 清空 @Override public void clear() { Arrays.stream(objArray).forEach(obj -> obj = null); top = -1; } // 判断是否为空 @Override public boolean isEmpty() { return top == -1; } // 获取的长度 @Override public int length() { return top + 1; } // 获取顶元素 @Override public Object peek() { if (isEmpty()) return null; return objArray[top]; } // 入操作 @Override public void push(Object object) throws Exception { if (top >= objArray.length - 1) throw new Exception("StackOverFlowError"); top++; objArray[top] = object; } // 出操作 @Override public Object pop() { if (isEmpty()) return null; top--; return objArray[top + 1]; } } // 定义的接口 interface IStack { void clear(); boolean isEmpty(); int length(); Object peek(); void push(Object object) throws Exception; Object pop(); } ``` ### 使用方法 #### 初始化 创建`ShunxuStack`对象时,需要指定的初始容量: ```java ShunxuStack stack = new ShunxuStack(10); ``` #### 入操作 调用`push`方法将元素压入中: ```java try { stack.push("element"); } catch (Exception e) { e.printStackTrace(); } ``` #### 出操作 调用`pop`方法将顶元素弹出: ```java Object element = stack.pop(); ``` #### 其他操作 还可以使用`isEmpty`判断是否为空,`peek`获取顶元素,`length`获取的长度,`clear`清空: ```java boolean isEmpty = stack.isEmpty(); Object topElement = stack.peek(); int length = stack.length(); stack.clear(); ``` #### 测试代码示例 ```java public class Main { public static void main(String[] args) { ShunxuStack stack = new ShunxuStack(10); try { stack.push("A"); stack.push("B"); stack.push("C"); System.out.println("顶元素: " + stack.peek()); System.out.println("的长度: " + stack.length()); Object poppedElement = stack.pop(); System.out.println("弹出的元素: " + poppedElement); System.out.println("是否为空: " + stack.isEmpty()); stack.clear(); System.out.println("清空后是否为空: " + stack.isEmpty()); } catch (Exception e) { e.printStackTrace(); } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值