分别基于顺序表和链表实现栈

一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
在这里插入图片描述

基于顺序表实现


package src.bit0414.Test;

/**
 * @ Created with IntelliJ IDEA.
 * @ClassName MyStack
 * @Description
 * @Author by
 * @Date 2020/4/26 18:25
 */
public class MyStack {
    // 栈可以基于顺序表实现, 也可以基于链表实现.
    private int[] array = new int[100];
    // array 中 [0, size) 区间中的元素是栈中的有效元素
    // 0 号元素相当于栈底; size - 1 位置的元素相当于栈顶
    private int size = 0;

    //进栈操作

    public void push(int value) {
        // 把 value 放到数组末尾. 此处没有考虑扩容的问题.
        array[size] = value;
        size++;
    }
    //出栈

    public Integer pop() {
        if (size <= 0) {
            // 此处的失败可以有两种表示方式.
            // 可以返回非法值, 也可以抛出异常.
            return null;
        }
        int ret = array[size - 1];
        size--;
        return ret;
    }

    public Integer peek() {
        if (size <= 0) {
            return null;
        }
        int ret = array[size - 1];
        return ret;
    }

    public static void main(String[] args) {
        MyStack myStack = new MyStack();
        myStack.push(1);
        myStack.push(2);
        myStack.push(3);
        myStack.push(4);
        while (true) {
            Integer cur = myStack.pop();
            if (cur == null) {
                break;
            }
            System.out.println(cur);
        }
    }
}

基于链表的实现

package src.bit0414.Test;

/**
 * @ Created with IntelliJ IDEA.
 * @ClassName MyStack2
 * @Description
 * @Author by
 * @Date 2020/4/26 21:02
 */
public class MyStack2 {
    static class Node {
        public int val;
        public Node next;

        public Node(int val) {
            this.val = val;
        }
    }
    // 使用链表也能实现栈. 用链表头部表示栈顶, 链表尾部表示栈底.
    // 只要知道头结点, 就能获取到后面的所有节点.
    // 一般表示链表. 都是使用一个头结点应用来表示整个链表.
    // 此处相当于是 "用局部表示整体" 这种修辞手法叫做 "借代"

    // 链表有八种链表.
    // 1. 不带环的 vs 带环的
    // 2. 单向的 vs 双向的
    // 3. 带傀儡节点的 vs 不带傀儡节点的.
    // 此处为了方便, 写一个带傀儡节点的链表

    Node head = new Node(-1);

    public void push(int value) {

        //头插
        Node  newHead = new Node(value);
        newHead.next = head.next;
        head.next = newHead;

    }

    public Integer pop() {
        //头删
        if(head.next==null) {
            return null;
        }
        int cur = head.next.val;
        head.next = head.next.next;
        return cur;


    }

    public Integer peek() {
        if(head.next==null) {
            return null;
        }
        return head.next.val;

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
顺序表链表是两种常见的数据结构,它们的主要区别在于内存分配方式不同。顺序表是一种基于数组实现的数据结构,它的元素在内存中是连续存储的,因此可以通过下标直接访问元素。而链表则是一种基于指针实现的数据结构,它的元素在内存中是分散存储的,每个元素都有一个指向下一个元素的指针,因此只能通过遍历链表来访问元素。 顺序和链也是两种常见的数据结构,它们的主要区别在于存储方式不同。顺序是一种基于数组实现,它的元素在内存中是连续存储的,因此可以通过下标直接访问元素。而链则是一种基于指针实现,它的元素在内存中是分散存储的,每个元素都有一个指向下一个元素的指针,因此只能通过遍历链表来访问元素。 异同点如下: 1.顺序表链表的主要区别在于内存分配方式不同,顺序表的元素在内存中是连续存储的,而链表的元素在内存中是分散存储的。 2.顺序和链的主要区别在于存储方式不同,顺序的元素在内存中是连续存储的,而链的元素在内存中是分散存储的。 3.顺序表和顺序实现方式类似,都是基于数组实现的,而链表和链实现方式类似,都是基于指针实现的。 4.顺序表链表的插入和删除操作的时间复杂度不同,顺序表的插入和删除操作需要移动其他元素,时间复杂度为O(n),而链表的插入和删除操作只需要修改指针,时间复杂度为O(1)。 5.顺序和链的插入和删除操作的时间复杂度也不同,顺序的插入和删除操作需要移动其他元素,时间复杂度为O(n),而链的插入和删除操作只需要修改指针,时间复杂度为O(1)。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值