java 实现栈的顺序存储和链式存储

一、栈的顺序存储,也就是使用数组存储:

注意事项:(用红色字体表示)

1.构造器必须要给数组进行初始化,即分配内存

2.数组初始化后的元素类型为Object,取出该元素的时候必须要进行强制转换,即向下转换类型。

 

/**
* 基于数组实现的顺序栈
* @param <E>
*/
public class Stack<E>{
    private Object[] data = null;     //由于不知道数组存储的类型,只能设置为Object类型
    private int maxSize = 0;          //栈容量
    private int top = -1;             //栈顶指针(从-1开始计起)

    public Stack(){
        this.maxSize = 10;      //默认栈大小为10

       data = new Object[maxSize];    

    }

    /**
     * 初始化时指定数组长度
     * @param initialSize
     */
    public Stack(int initialSize){
        if (initialSize > 0){
            this.maxSize = initialSize;
            data = new Object[initialSize];
        }
    }

    /**
     * 判断栈是否为空
     * @return
     */
    public boolean empty(){
//        if (top == -1){
//            return true;
//        }
//        return false;
        return top==-1? true: false;
    }

    /**
     * 进栈
     * @param e
     */
    public void push(E e){
        if (top == maxSize-1){
            System.out.println("该栈已满");
            return;
        }
        top ++;
        data[top] = e;
    }

    /**
     * 出栈
     * @return
     */
    public E pop(){
        if (top == -1){
           throw new RuntimeException("栈为空");
        }
        E e = (E)data[top];     //将元素类型进行转换
        top--;
        return e;
    }

    public static void main(String[] args){
        Stack<Integer> s1 = new Stack<>(10);
        System.out.println("该栈是否为空:" + s1.empty());

        s1.push(5);
        s1.push(0);
        s1.push(8);
        s1.push(3);
        s1.push(2);
        s1.push(1);
        System.out.println("出栈的元素依次是:");
        while (! s1.empty()){
            System.out.println(s1.pop());
        }
    }
}

 

二、栈的链式存储,即单链表

注意事项:(也用青色字体表示)

1.这里使用了内部类,也可以将其摘取出来,单独形成一个类,但是要注意泛型的使用方法和范围;

2.就是关于Node类中的构造器,这个构造器的作用就是传入一个新的节点,并将其作为本节点所指向的节点,即本节点初始化的时候,就可以指定“我”要所指的对象是谁。这个功能是很重要的,因为在实现进栈的时候,就可以在每次添加新元素的时候将top指针作为本节点的下一个元素,从而实现了栈顶添加元素。

/**
*  栈的链式存储
* @param <E>
*/
public class LinkStack <E>{
    private class Node<E>{
       
E data;
        Node<E> next;

        public Node(E data, Node next){
            this.data = data;
            this.next = next;
        }

    }

    private Node<E> top;    //栈顶元素
    private int size = 0;             //当前栈大小

    public LinkStack(){
        this.top = null;
    }

    /**
     * 判断栈是否为空
     * @return
     */
    public boolean empty(){
        if (top == null){
            return true;
        }
        return false;
    }

    /**
     * 入栈
     * @param e
     */
    public void push(E e){
        top = new Node(e, top);     //  添加一个新元素时,直接将其放在top上面,然后将top往上移动一个
        size ++;
     }

    /**
     * 出栈
     * @return
     */
    public E pop(){
        if (empty()){
            throw new RuntimeException("空栈异常");
        }
        Node<E> value = top;
        E e = top.data;
        top = value.next;
        value = null;       //释放原栈顶元素
        size --;
        return e;
     }

     public int stackLength(){
        return size;
     }

     public  static  void main(String[] args){
        LinkStack<Integer> ls = new LinkStack<>();
         System.out.println("该栈是否为空:" + ls.empty());

         ls.push(5);
         ls.push(0);
         ls.push(8);
         ls.push(3);
         ls.push(2);
         ls.push(1);
         System.out.println("该栈是否为空:" + ls.empty());
         System.out.println("出栈的元素依次是:");
         while (! ls.empty()){
             System.out.println(ls.pop());
         }
     }
}

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
顺序存储结构构建顺序表: ```java public class SeqList { private Student[] students; // 存放学生的数组 private int size; // 数组中元素的个数 private int capacity; // 数组的容量 public SeqList(int capacity) { this.capacity = capacity; this.students = new Student[capacity]; this.size = 0; } // 添加学生到顺序表的末尾 public void add(Student student) { if (size == capacity) { System.out.println("顺序表已满,无法添加学生"); return; } students[size++] = student; } // 根据学号查找学生 public Student findByNo(String stuNo) { for (int i = 0; i < size; i++) { if (students[i].getStuNo().equals(stuNo)) { return students[i]; } } return null; } // 删除指定学号的学生 public boolean deleteByNo(String stuNo) { for (int i = 0; i < size; i++) { if (students[i].getStuNo().equals(stuNo)) { for (int j = i; j < size - 1; j++) { students[j] = students[j + 1]; } students[size - 1] = null; size--; return true; } } return false; } } ``` 链存储结构构建链表: ```java public class ListNode { private Student student; private ListNode next; public ListNode(Student student) { this.student = student; this.next = null; } public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } public ListNode getNext() { return next; } public void setNext(ListNode next) { this.next = next; } } public class LinkedList { private ListNode head; // 头结点 private int size; // 链表中元素的个数 public LinkedList() { this.head = new ListNode(null); this.size = 0; } // 添加学生到链表的末尾 public void add(Student student) { ListNode node = new ListNode(student); ListNode cur = head; while (cur.getNext() != null) { cur = cur.getNext(); } cur.setNext(node); size++; } // 根据学号查找学生 public Student findByNo(String stuNo) { ListNode cur = head.getNext(); while (cur != null) { if (cur.getStudent().getStuNo().equals(stuNo)) { return cur.getStudent(); } cur = cur.getNext(); } return null; } // 删除指定学号的学生 public boolean deleteByNo(String stuNo) { ListNode cur = head.getNext(); ListNode pre = head; while (cur != null) { if (cur.getStudent().getStuNo().equals(stuNo)) { pre.setNext(cur.getNext()); size--; return true; } pre = cur; cur = cur.getNext(); } return false; } } ``` 顺序存储结构构建顺序: ```java public class SeqStack { private Student[] students; // 存放学生的数组 private int top; // 顶指针 private int capacity; // 的容量 public SeqStack(int capacity) { this.capacity = capacity; this.students = new Student[capacity]; this.top = -1; } // 入 public void push(Student student) { if (top == capacity - 1) { System.out.println("已满,无法添加学生"); return; } students[++top] = student; } // 出 public Student pop() { if (top == -1) { System.out.println("已空,无法弹出学生"); return null; } return students[top--]; } // 查看顶元素 public Student peek() { if (top == -1) { System.out.println("已空"); return null; } return students[top]; } // 判断是否为空 public boolean isEmpty() { return top == -1; } } ``` 链存储结构构建链: ```java public class LinkedStack { private ListNode top; // 顶结点 private int size; // 中元素的个数 public LinkedStack() { this.top = null; this.size = 0; } // 入 public void push(Student student) { ListNode node = new ListNode(student); node.setNext(top); top = node; size++; } // 出 public Student pop() { if (top == null) { System.out.println("已空,无法弹出学生"); return null; } Student student = top.getStudent(); top = top.getNext(); size--; return student; } // 查看顶元素 public Student peek() { if (top == null) { System.out.println("已空"); return null; } return top.getStudent(); } // 判断是否为空 public boolean isEmpty() { return top == null; } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值