栈和队列(小结)

近期开始接触栈和队列相关知识,特此根据现有知识对栈和队列做以小结,以下博客仅作为个人学习过程的小结,如能对各位博友有所帮助不胜荣幸。
本篇博客将简单介绍相关知识,以及其注意事项有哪些,只做本人小结,后期随学习深入再做补充修改。

栈(stack):

概念

栈是一种特殊的线性表,在结点上的操作受到了限制,即上篇博客所提及的受限线性表。只能固定的从一段插入和删除结点,通俗上将允许进行插入删除操作的一端称为栈顶,想应的另一端称为栈底。将结点插入到栈顶中的操作称为入栈,而将栈顶结点删除的操作称为出栈。
他的特点为,后入先出——在这里插入图片描述

在这里插入图片描述

队列(Queue):

概念

队列同之前的栈一样也是一种受限线性表,其被限制表的前端进行删除,在表的后端进行插入,通俗上将删除端称为队头,将插入端称为队尾。
其特点为,先入先出——

在这里插入图片描述
在这里插入图片描述

双端队列(Deque)

概念:

双端队列是两端允进行插入删除操作的,它可以实现栈的操作同时也可以实现队列的操作

栈和队列的实现

  • 仿写(java.util.impl.Queue)的 Queue 接口
package imp;

import java.util.NoSuchElementException;
//仿写(java.util.impl.Queue)的 Queue 接口

public interface Queue {
    //通过返回特殊值来通知错误的一组方法
    //插入(true 成功,false 失败)
    boolean offer(Integer e);
    //查看,返回队首元素,但不删除(返回null为空列表)
    Integer peek();
    //删除,返回并删除并删除首元素(返回null为空列表)
    Integer poll();

    //通过抛出异常来通知错误的一组方法
    //插入(永远返回true)
    default boolean add(Integer e){
        if(!offer(e)){
            throw new IllegalStateException();
        }
        return offer(e);
    }
    //查看,返回队首元素,但不删除
    default Integer element(){
        if(peek() == null){
            throw new NoSuchElementException();
        }
        return peek();
    }
    //删除,返回并删除并删除首元素
    default Integer remove(){
        if(poll() == null){
            throw new NoSuchElementException();
        }
        return poll();
    }
}
  • 定义一个 Deque 接口让它继承 Queue 接口
package imp;

import java.util.NoSuchElementException;

public interface Deque extends Queue {
    //通过返回特殊值来通知错误的一组方法
    boolean offerFirst(Integer e);
    Integer peekFirst();
    Integer pollFirst();
    boolean offerLast(Integer e);
    Integer peekLast();
    Integer pollLast();

    //通过抛出异常来通知错误的一组方法
    default boolean addFirst(Integer e){
        if(!offerFirst(e)){
            throw new IllegalStateException();
        }
        return offerFirst(e);
    }

    default boolean addLast(Integer e){
        if(!offerLast(e)){
            throw new IllegalStateException();
        }
        return offerLast(e);
    }

    default Integer getFirst(){
        if(peekFirst() == null){
            throw new NoSuchElementException();
        }
        return peekFirst();
    }

    default Integer getLast(){
        if(peekLast() == null){
            throw new NoSuchElementException();
        }
        return peekLast();
    }

    default Integer removeFirst(){
        if(pollFirst() == null){
            throw new NoSuchElementException();
        }
        return pollFirst();
    }

    default Integer removeLast(){
        if(pollLast() == null){
            throw new NoSuchElementException();
        }
        return pollLast();
    }

    //继承自 Queue 的方法
    default boolean offer(Integer e){
        return offerLast(e);
    }
    //查看,返回队首元素,但不删除(返回null为空列表)
    default Integer peek(){
        return  getFirst();
    }
    //删除,返回并删除并删除首元素(返回null为空列表)
    default Integer poll(){
        return pollFirst();
    }

    //为 stack 准备的方法
    default void push(Integer e){
        addFirst(e);
    }
    default Integer pop(){
        return removeFirst();
    }
}

  • 定义一个 LinkedList 类来实现 Deque 接口
package imp;

 public class LinkedList implements Deque{
    private static class Node{
        private Integer v;
        Node previous;
        Node next;
        Node(Integer e){
            v = e;
        }
        @Override
        public String toString() {
            return v + " ";
        }
    }
    private Node head;
    private Node tail;
    private int size;
    @Override
    public boolean offerFirst(Integer e) {
        Node node = new Node(e);
        if (size == 0) {
            head = node;
            tail = node;
        }else {
            head.previous = node;
            node.next = head;
            head = node;
        }
        size++;
        return true;
    }

    @Override
    public Integer peekFirst() {
        if(head == null){
            return null;
        }
        return head.v;
    }

    @Override
    public Integer pollFirst() {
        if(size == 0){
            return null;
        }
        int num = head.v;
        head = head.next;
        if(head != null){
            head.previous = null;
        }else{
            tail = null;
        }
        size--;
        return num;
    }

    @Override
    public boolean offerLast(Integer e) {
        Node node = new Node(e);
        if(size == 0){
            head = node;
        }else{
            node.previous = tail;
            tail.next = node;
        }
        tail = node;
        size++;
        return true;
    }

    @Override
    public Integer peekLast() {
        if(tail == null){
            return null;
        }
        return tail.v;
    }

    @Override
    public Integer pollLast() {
        if(size == 0){
            return null;
        }
        int num = tail.v;
        tail = tail.previous;
        if(tail != null){
            tail.next = null;
        }else{
            head = null;
        }
        size--;
        return num;
    }
 }

  • 调试 自行实现的 Stack 和 Queue
package imp;

package imp;

public class MyStack {
    public static void main(String[] args) {
        Deque myStack = new LinkedList();
        myStack.push(1);
        System.out.print(myStack.peek()+" ");
        myStack.push(2);
        System.out.print(myStack.peek()+" ");
        myStack.push(3);
        System.out.print(myStack.peek()+" ");
        myStack.push(4);
        System.out.print(myStack.peek()+" ");
        myStack.push(5);
        System.out.println(myStack.peek()+" ");
        myStack.pop();
        System.out.println(myStack.peek());
    }
}

在这里插入图片描述

package imp;

public class MyQueue {
    public static void main(String[] args) {
        Deque myQueue = new LinkedList();
        myQueue.add(1);
        System.out.print(myQueue.element()+" ");
        myQueue.add(2);
        System.out.print(myQueue.element()+" ");
        myQueue.add(3);
        System.out.print(myQueue.element()+" ");
        myQueue.add(4);
        System.out.print(myQueue.element()+" ");
        myQueue.add(5);
        System.out.println(myQueue.remove());
        System.out.print(myQueue.element()+" ");
    }
}

在这里插入图片描述
在这里插入图片描述
以上即是本博客对 栈和队列 的总结,随着后续学习的深入还会同步的对内容进行补充和修改,如能帮助到各位博友将不胜荣幸,敬请斧正

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值