栈和队列

一.栈

1.1 栈的概念

就是一种特殊的线性表,只允许固定的一端进行插入和删除元素的操作,进行数据的插入删除操作的一端称为栈顶,另一端称为栈底 栈中的数据元素遵守 后进先出 LIFO的原则
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶
出栈:栈的删除操作叫做出栈,出数据在栈顶
在这里插入图片描述

1.2 实现

用顺序表实现栈

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

    public void push(int v){
        arr[size++] = v;
    }

    public int pop(){
        return arr[size--];
    }

    public int peek(){
        return arr[size];
    }

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

    public int size(){
        return size;
    }
}

二.队列

2.1 队列的概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有 先进先出 FIFO
入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为对头
在这里插入图片描述

2.2 实现

用链表实现队列

class ListNode{
    public int val;
    public ListNode next;
    public ListNode(int val){
        this.val = val;
    }
}

public class MyQueue {
    public ListNode head;
    public ListNode fail;
    public int size;

    public void offer(int x){
        ListNode node = new ListNode(x);
        if(this.fail == null){
            this.head = node;
            this.fail = node;
        }else {
            this.fail.next = node;
            this.fail = node;
        }
        size++;
    }

    public int poll(){
        if(size == 0){
            throw new RuntimeException("队列为空");
        }
        ListNode node = this.head;
        this.head = this.head.next;
        if(this.head == null){
            this.fail = null;
        }
        size--;
        return node.val;
    }

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

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

    public int size(){
        return size;
    }
}
2.3 循环队列

在这里插入图片描述
将1 和 2 入队列后:
在这里插入图片描述

区分循环队列空和队列满?
1.少用一个存储位置‘
2.设置一个标记 flag
3.计数,count记录队列中有效元素的个数

1.少用一个存储位置
判空条件:front == rear
判满条件:(rear+1) % capacity == front
在这里插入图片描述
2.设置一个标记 flag
入队列:在rear位置尾插一个,将flg = true
出队列:front往后移动,将flg = false
判空:front = rear && flg = false
判满:front = rear && flg = true
3.计数,count记录队列中有效元素的个数
入队列:在rear位置尾插一个,将count++
出队列:front往后移动,将count–
判空:count == 0
判满:count == capacity

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值