栈和队列

Posted noneplus

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈和队列相关的知识,希望对你有一定的参考价值。

关于栈与队列

栈与队列是特殊的线性表。

访问,插入,删除等操作只能在栈顶进行;对于队列,元素只能从队尾插入,从队头删除和访问。

换句话说,栈和队列是有操作限制的线性表。

顺序存储的栈称为顺序栈;链式存储的栈称为链式栈。

基于数组实现栈

package com.company;

public class StackOperation<T> {

    private T data[];
    private int maxSize;
    private int top;


    //初始化栈
    public StackOperation(int maxSize) {
        this.maxSize=maxSize;
        data=(T[])new Object[maxSize]; //泛型数组不能直接new创建,需要使用Object来创建
        this.top=-1;
    }

    //判断栈是否为空
    public boolean isEmpty() {
        return (top==-1);
    }

    //判断栈是否已经满了
    public  boolean isFull() {
        return (top==maxSize-1);
    }


    //压栈
    public boolean push(T value) {
        if(isFull()) {
            return false;
        }
        top++;
        data[top]=value;
        return true;
    }


    //取出栈顶元素
    public T pop() {
        if(isEmpty()) {
            return null;
        }
        T tmp=data[top];
        data[top]=null;
        top--;
        return tmp;
    }

    //============测试代码============
    public static void main(String[] args) {
        StackOperation<String> stackOperation=new StackOperation<String>(10);
        stackOperation.push("AAA");
        stackOperation.push("BBB");
        stackOperation.push("CCC");
        stackOperation.push("DDD");
        stackOperation.push("EEE");
        stackOperation.push("XXX");
        stackOperation.push("YYY");
        stackOperation.push("ZZZ");


        while(!stackOperation.isEmpty())
        {
            System.out.println(stackOperation.pop());
        }
    }

}

基于链表实现栈

package com.company;

class Node<T>{
    protected T data;//数据
    private Node<T> next;//指向下一个节点的指针
    //初始化链表
    public Node(T data) {
        this.data=data;
    }
    //获取下一个节点
    public Node<T> getNext(){
        return this.next;
    }
    //设置下一个节点
    public void setNext(Node<T> n) {
        this.next=n;
    }
    //获取节点数据
    public T getData() {
        return this.data;
    }
    //设置节点数据
    public void setData(T d) {
        this.data=d;
    }

    @Override
    public String toString() {
        return "Node{" +
                "data=" + data +
                ", next=" + next +
                '}';
    }
}

public class NodeStack<T> {

    private Node<T> top=null;//栈顶

    public NodeStack() {
        this.top=null;
    }

    //判断栈是否为空
    public boolean isEmpty() {
        if(top!=null) {
            return false;
        }
        return true;
    }

    //压栈
    public boolean push(T value) {
        Node<T> node=new Node<T>(value);
        node.setNext(top);
        top=node;
        return true;
    }

    //出栈
    public T pop() {
        if(top==null) {
            return null;
        }
        T tmp=top.data;
        top=top.getNext();
        return tmp;
    }

    //取出栈顶的值
    public T peek() {
        if(isEmpty()) {
            return null;
        }
        return top.data;
    }




    public static void main(String[] args) {

        System.out.println("实例化一个栈:");
        NodeStack<String> ns=new NodeStack<String>();

        System.out.println("判断是否为空:"+ns.isEmpty());

        System.out.println();

        System.out.println("开始压栈:");
        ns.push("AAA");
        ns.push("BBB");
        ns.push("CCC");
        ns.push("DDD");

        System.out.println("判断是否为空:"+ns.isEmpty());

        System.out.println();
        System.out.println("开始出栈:");

        System.out.println(ns.pop());
        System.out.println(ns.pop());
        System.out.println(ns.pop());
        System.out.println(ns.pop());

    }
}

基于数组实现队列

package com.company;

public class QueueOperation<T> {

    private T data[];
    private int front=0;//队列头
    private int rear=0;//队列尾
    private int size;//队列大小

    public QueueOperation(int size) {
        this.size = size;
        data = (T[])new Object[size];
    }

    /**
     * 是否为空队列
     * @return
     */
    public boolean isEmpty(){
        return  front == rear;
    }
    /**
     * 入队
     * @param value
     */
    public void in(T value) throws Exception {
        if(rear == size){
            throw  new Exception("队列已满异常");
        }
        data[rear ++] = value;
    }

    /**
     * 出队
     */
    public Object out() throws Exception {
        if(isEmpty()){
            throw  new Exception("空队列异常");
        }
        T value = data[front];
        data[front++] = null;

        return value;
    }

    public static void main(String[] args) throws Exception {
        QueueOperation<String> queueOperation= new QueueOperation<>(10);
        queueOperation.in("AAA");
        queueOperation.in("BBB");
        queueOperation.in("CCC");
        queueOperation.in("DDD");
        queueOperation.in("EEE");
        queueOperation.in("XXX");
        queueOperation.in("YYY");
        queueOperation.in("ZZZ");

        while (!queueOperation.isEmpty())
        {
            System.out.println(queueOperation.out());
        }
    }
}

基于链表实现队列

package com.company;

class Node<T> {
    // 存储的数据
    private T data;
    // 下一个节点的引用
    private Node<T> next;

    public Node(T data) {
        this.data = data;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public Node<T> getNext() {
        return next;
    }

    public void setNext(Node<T> next) {
        this.next = next;
    }

}

public class LinkQueue<T> {

    // 队头
    private Node<T> front;
    // 队尾
    private Node<T> rear;
    // 元素个数
    private int size;

    /**
     * 初始化
     */
    public LinkQueue() {
        rear = front = null;
    }

    /**
     * 入队
     * @param data
     */
    public void in(T data) {
        Node<T> node = new Node<T>(data);
        if (isEmputy()) {
            front = rear = node;
        } else {
            rear.setNext(node);
            rear = node;
        }

        size++;
    }

    /**
     * 出队
     */
    public T out() {
        if (isEmputy()) {
            throw new RuntimeException("队列为空");
        }

        Node<T> delete = front;
        front = delete.getNext();
        delete.setNext(null);;
        size--;

        if (size == 0) {
            // 删除掉最后一个元素时,front值已经为null,但rear还是指向该节点,需要将rear置为null
            // 最后一个结点front和rear两个引用都没指向它,帮助GC处理该节点对象
            rear = front;
        }

        return (T) delete.getData();
    }

    /**
     * 判断队列是否为空
     * @return
     */
    public boolean isEmputy() {
        return (front == null && rear == null) ? true : false;
    }

    /**
     * 获取队列的元素个数
     * @return
     */
    public int size() {
        return this.size;
    }

    public static void main(String[] args) {
        LinkQueue<String> linkQueue = new LinkQueue<>();
        linkQueue.in("AAA");
        linkQueue.in("BBB");
        linkQueue.in("CCC");
        linkQueue.in("DDD");

        while (!linkQueue.isEmputy())
        {
            System.out.println(linkQueue.out());
        }

    }

}

以上是关于栈和队列的主要内容,如果未能解决你的问题,请参考以下文章

栈和队列基本操作

栈和队列

博客作业03--栈和队列

博客作业03--栈和队列

栈和队列知识点总结

栈和队列的面试题Java实现