【数据结构】栈和队列

栈和队列

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

  1. 利用顺序表实现,即使用尾插 + 尾删的方式实现
  2. 利用链表实现,则头尾皆可
    (优先使用顺序表)
import java.util.Arrays;

public class Stack {
    private int[] array;
    private int top;

    public Stack(int defaultCapacity) {
        array = new int[defaultCapacity];
        top = 0;
    }

    public Stack() {
        this(20);
    }
//插入栈顶元素
    public void push(int val) {
        if (top == array.length) {
            array = Arrays.copyOf(array, array.length * 2);
        }
        array[top++] = val;
    }
//删除栈顶元素
    public void pop() {
        if (top <= 0) {
            System.out.println("栈为空,无法删除");
            return;
        }

        top--;
        array[top] = 0;    // 可加可不加,把所有空的位置保持为 0
    }
//返回栈顶元素
    public int top() {
        if (top <= 0) {
            System.out.println("栈为空,无法返回栈顶元素");
            return -1;
        }

        return array[top - 1];
    }

    public int size() {
        return top;
    }
//判断是否为空
    public boolean isEmpty() {
        return top == 0;
    }
}

二、队列
1.概念:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为队头(Head/Front)
在这里插入图片描述
2.实现:

class Node {
    int val;
    Node next;

    Node(int val, Node next) {
        this.val = val;
        this.next = next;
    }

    Node(int val) {
        this(val, null);
    }
}

public class Queue {
    private Node front = null;  // 链表的第一个结点
    private Node rear = null;   // 链表的最后一个结点
    private int size = 0;

    // 尾插
    public void push(int val) {
        Node node = new Node(val);
        if (front == null) {
            front = node;
        } else {
            rear.next = node;
        }

        rear = node;
        size++;
    }

    // 头删
    public void pop() {
        if (size <= 0) {
            System.out.println("队列为空");
            return;
        }

        front = front.next;
        if (front == null) {
            rear = null;
        }
        size--;
    }

    public int front() {
        if (size <= 0) {
            System.out.println("队列为空");
            return -1;
        }

        return front.val;
    }

    public int rear() {
        if (size <= 0) {
            System.out.println("队列为空");
            return -1;
        }

        return rear.val;
    }

    public int size() {
        return size;
    }

    public boolean isEmpty() {
        return size == 0;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值