栈和队列的代码实现

概念:
栈是一种特殊的线性表,只允许在固定的一段进行插入删除操作,进行数据的插入删除操作的一端称为栈顶,另一端称为栈底,栈中的元素遵循先进后出的原则。
压栈:
栈的插入操作叫做压栈,入数据在栈顶
栈的删除操作叫做出栈,出数据也在栈顶

用顺序表实现栈的相关操作:

public class MyStack {
    private int[] arr = new int[100];
    private int size;

    public boolean push(int x) {
        if(size == arr.length) {
            return false;
        }
        arr[size++] = x;
        return true;
    }

    public int pop() {
        if(size == 0) {
            return -1;
        }
        return arr[--size];
    }

    public int peek() {
        if(size == 0) {
            return -1;
        }
        return arr[size-1];
    }

    public boolean empty() {
        if(size == 0) {
            return true;
        }
        return false;
    }

    public int size() {
        return size;
    }
}

队列:
队列是只允许在一段进行插入操作,在另一端进行删除操作的线性表,队列具有先进先出的特性,进行插入操作的一端称为队尾,进行删除操作的一端称为队首。
队列也可以用顺序表和链表实现,如果使用数组的结构,出队列在数组头上出数据,效率比较低。

代码实现:

class Node {
    int val;
    Node next;

    public Node(int val) {
        this.val = val;
    }
}
public class MyQueue {
    private Node head = null;
    private Node tail = null;
    private int size = 0;

    public void offer(int x) {
        Node node = new Node(x);
        if(head == null) {
            head = node;
            tail = node;
            return;
        }
        tail.next = node;
        tail = node;
        size++;
    }

    public int pop() {
        if(size == 0) {
            throw new RuntimeException("队列为空");
        }
        size--;
        Node node = head;
        head = head.next;
        if(head == null) {
            tail = null;
        }
        return node.val;

    }

    public int peek() {
        if(size == 0) {
            throw new RuntimeException("队列为空!");
        }
        return head.val;
    }

    public boolean isEmpty() {
        if(size == 0) {
            return true;
        }
        return false;
    }

    public int size() {
        return size;
    }
}

数组循环队列:
说明:

  • 需要一个变量 front 标志队首位置
  • 需要一个变量 rear 标志队尾的下一个位置
  • 插入元素时 front +1;
  • 删除元素时 rear -1;
  • 每次更新时 front = (front + 1) % 数组长度 (rear同理)
  • 当 front 和 rear 相隔为1 时,数组可能为空也可能满了,所以需要定义一个类的属性size储存已储存的元素的个数。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值