数据结构 栈 (Java 语言 实现)

数据结构 栈 (Java 语言 实现)

数据结构 栈

  • 没有理论 只有代码

项目

  • Maven java 项目 + junit 测试

代码

  • 常见的 就是用 数组 去实现 栈
  • 这里 也 用数组 去实现一下
使用数组 实现
package com.codervibe.ch02;

public class StackInArray<E> {
    private int top;
    //保存数据的容器
    private Object data[];
    //栈的 元素个数
    private int size;



    public StackInArray(int size) {
        this.data = new Object[size];
        this.size = size;
        this.top = -1;
    }

    //获取 栈中 的 元素个数
    public int getSize() {
        return this.size;
    }

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

    //判断 栈 是否已满
    public boolean isPull() {
        return this.top == size - 1;
    }

    /**
     * 向栈中 添加元素 压栈
     * @param e
     */
    public void push(E e) {
        if (isPull()) {
            System.out.println("栈 已满, 无法压栈");
        }
        data[++top]=e;
    }
    //将数据从栈中 取出
    public E pop() throws Exception {
        if (isEmpty()) {
            System.out.println("栈 已空, 无法弹栈");
        }
        return (E)data[top--];

    }
    //输出栈
    public void print() {
        if(isEmpty()){
            System.out.println("栈已空,无法输出");
        }
        for (int i = top; i >= 0; i--) {
            System.out.println("data[" + i + "] = " + data[i]);
        }
    }



}
  • 测试 方法
@Test
    public void T1() throws Exception {
        StackInArray<Integer> stringStackInArray =new StackInArray<>(9);
        System.out.println("初始化已完成 检查 栈 是否为空 " + stringStackInArray.isEmpty());
        stringStackInArray.push(1);
        stringStackInArray.push(2);
        stringStackInArray.push(3);
        stringStackInArray.push(4);
        stringStackInArray.push(5);
        stringStackInArray.push(6);
        stringStackInArray.push(7);
        System.out.println("入栈以后的 栈的大小为" + stringStackInArray.getSize());
        // 打印栈中的所有元素
        stringStackInArray.print();
        System.out.println("出栈 并返回 出栈的元素 "+stringStackInArray.pop());
        System.out.println("栈 当前的大小 为 " + stringStackInArray.getSize());
        System.out.println("出栈 之后 打印 栈 中的所有元素");
        // 打印栈中的所有元素
        stringStackInArray.print();
    }
使用链表 实现
  • 注意的是 代码中 的 链表类 是上一篇链表中的类 如果找不到可以去 上一篇 找
  • 话不多说 直接上代码
package com.codervibe.ch02;


import com.codervibe.ch01.OneWayLinkList;

public class StackInLinkedList<T> {
    // 栈 顶
    private int top = -1;
    // 栈的最大值
    private int MaxSize;
    // 栈中的 数据
    private OneWayLinkList<T> data;

    // 初始化 栈
    public StackInLinkedList() {
        //  栈 中的 数据 就是 一个单项链表
       data = new OneWayLinkList<>();
       this.MaxSize =0;
    }
    //判断 栈 是否 已满
    public boolean isFull(){
        return MaxSize == this.data.length;
    }
    // 判断 栈 是否为空
    public boolean isEmpty() {
        return this.MaxSize == 0;
    }
    // 入栈
    // 链表中 具有 有几个 数据 长度 就有多大的 特性 所以 入栈 多少数据 栈就有多大
    public void push(T value){
//        if (isFull()) {
//            System.out.println("栈已满");
//        }

        this.data.insert(value);
        MaxSize++;
    }
    // 出栈
    public T pop(){
        if (isEmpty()) {
            System.out.println("栈 为空 没有元素可以 出栈");
        }
        T oldValue = this.data.remove(MaxSize - 1);
        MaxSize--;
        return oldValue;
    }
    // 返回 栈顶元素
    //其实就是 获取 栈大小 -1  的 位置的 数据
    public T peek(){
        if (isEmpty()) {
            System.out.println("栈 为空 没有元素");
        }
        return this.data.get(MaxSize - 1);
    }
    // 返回 栈的长度
    public int size() {
        return this.data.length;
    }
}
  • 测试方法
    @Test 
    public void T2(){
        StackInLinkedList<String> stringStackInLinkedList =new StackInLinkedList<>();
        System.out.println("初始化 栈 检查 栈 是否为空 "+stringStackInLinkedList.isEmpty());
        stringStackInLinkedList.push("1111111");
        stringStackInLinkedList.push("2222222");
        stringStackInLinkedList.push("3333333");
        stringStackInLinkedList.push("4444444");
        stringStackInLinkedList.push("5555555");
        System.out.println("入栈已完成 检查 栈 是否 已满 "+stringStackInLinkedList.isFull());
        System.out.println("栈的大小 为  " + stringStackInLinkedList.size());

        System.out.println("查看栈顶元素 "+stringStackInLinkedList.peek());
        stringStackInLinkedList.pop();
        stringStackInLinkedList.pop();
        stringStackInLinkedList.pop();
        stringStackInLinkedList.pop();
        stringStackInLinkedList.pop();
        System.out.println("出栈 已完成 检查 栈是否 已为 空 "+stringStackInLinkedList.isEmpty());
    }

完整的代码

  • 实现类
package com.codervibe.ch02;


import com.codervibe.ch01.OneWayLinkList;

public class StackInLinkedList<T> {
    // 栈 顶
    private int top = -1;
    // 栈的最大值
    private int MaxSize;
    // 栈中的 数据
    private OneWayLinkList<T> data;

    // 初始化 栈
    public StackInLinkedList() {
        //  栈 中的 数据 就是 一个单项链表
       data = new OneWayLinkList<>();
       this.MaxSize =0;
    }
    //判断 栈 是否 已满
    public boolean isFull(){
        return MaxSize == this.data.length;
    }
    // 判断 栈 是否为空
    public boolean isEmpty() {
        return this.MaxSize == 0;
    }
    // 入栈
    // 链表中 具有 有几个 数据 长度 就有多大的 特性 所以 入栈 多少数据 栈就有多大
    public void push(T value){
//        if (isFull()) {
//            System.out.println("栈已满");
//        }

        this.data.insert(value);
        MaxSize++;
    }
    // 出栈
    public T pop(){
        if (isEmpty()) {
            System.out.println("栈 为空 没有元素可以 出栈");
        }
        T oldValue = this.data.remove(MaxSize - 1);
        MaxSize--;
        return oldValue;
    }
    // 返回 栈顶元素
    //其实就是 获取 栈大小 -1  的 位置的 数据
    public T peek(){
        if (isEmpty()) {
            System.out.println("栈 为空 没有元素");
        }
        return this.data.get(MaxSize - 1);
    }
    // 返回 栈的长度
    public int size() {
        return this.data.length;
    }
}
  • 测试类
package com.codervibe.ch02;

import org.junit.Test;

import java.util.Stack;

public class StackTest {
    
    @Test
    public void T1() throws Exception {
        StackInArray<Integer> stringStackInArray =new StackInArray<>(9);
        System.out.println("初始化已完成 检查 栈 是否为空 " + stringStackInArray.isEmpty());
        stringStackInArray.push(1);
        stringStackInArray.push(2);
        stringStackInArray.push(3);
        stringStackInArray.push(4);
        stringStackInArray.push(5);
        stringStackInArray.push(6);
        stringStackInArray.push(7);
        System.out.println("入栈以后的 栈的大小为" + stringStackInArray.getSize());
        // 打印栈中的所有元素
        stringStackInArray.print();
        System.out.println("出栈 并返回 出栈的元素 "+stringStackInArray.pop());
        System.out.println("栈 当前的大小 为 " + stringStackInArray.getSize());
        System.out.println("出栈 之后 打印 栈 中的所有元素");
        // 打印栈中的所有元素
        stringStackInArray.print();
    }
    @Test
    public void T2(){
        StackInLinkedList<String> stringStackInLinkedList =new StackInLinkedList<>();
        System.out.println("初始化 栈 检查 栈 是否为空 "+stringStackInLinkedList.isEmpty());
        stringStackInLinkedList.push("1111111");
        stringStackInLinkedList.push("2222222");
        stringStackInLinkedList.push("3333333");
        stringStackInLinkedList.push("4444444");
        stringStackInLinkedList.push("5555555");
        System.out.println("入栈已完成 检查 栈 是否 已满 "+stringStackInLinkedList.isFull());
        System.out.println("栈的大小 为  " + stringStackInLinkedList.size());

        System.out.println("查看栈顶元素 "+stringStackInLinkedList.peek());
        stringStackInLinkedList.pop();
        stringStackInLinkedList.pop();
        stringStackInLinkedList.pop();
        stringStackInLinkedList.pop();
        stringStackInLinkedList.pop();
        System.out.println("出栈 已完成 检查 栈是否 已为 空 "+stringStackInLinkedList.isEmpty());

    }
    // JDK 中 就实现了 栈
    // 可以去看看 源码
    @Test
    public void T3(){
        // JDK 栈
        Stack<String> stringStack =new Stack<>();
        System.out.println("初始化栈  栈 是否 为空 " + stringStack.isEmpty());
        stringStack.push("1");
        stringStack.push("2");
        stringStack.push("3");
        stringStack.push("4");
        System.out.println("入栈 已完成  栈 是否 为空 " + stringStack.isEmpty());
        System.out.println("stringStack.size() = " + stringStack.size());
    }

}

你可能感兴趣的:(数据结构,java,数据结构,开发语言)