0%

数据结构-栈、队列

先进后出(LIFO, Last In First Out)

静态栈

数组 栈大小固定

动态栈

链表 栈大小不固定

public class Node {

    //数据域
    public int data;

    //指针域,指向下一个节点
    public Node next;

    public Node() {
    }

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

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

public class Stack {

    public Node stackTop;//栈顶
    public Node stackBottom;//栈底

    public Stack(Node stackTop, Node stackBottom) {
        this.stackTop = stackTop;
        this.stackBottom = stackBottom;
    }

    public Stack() {
    }


}

/**
 * 进栈
 *
 * @param stack 栈
 * @param value 要进栈的元素
 */
public static void pushStack(Stack stack, int value) {

    // 封装数据成节点
    Node newNode = new Node(value);


    // 栈顶本来指向的节点交由新节点来指向
    newNode.next = stack.stackTop;

    // 栈顶指针指向新节点
    stack.stackTop = newNode;

}


/**
 * 遍历栈(只要栈顶指针不指向栈底指针,就一直输出)
 *
 * @param stack
 */
public static void traverse(Stack stack) {
    Node stackTop = stack.stackTop;

    while (stackTop != stack.stackBottom) {

        System.out.println("关注公众号:Java3y:" + stackTop.data);

        stackTop = stackTop.next;
    }


}

/**
 * 判断该栈是否为空
 *
 * @param stack
 */
public static void isEmpty(Stack stack) {
    if (stack.stackTop == stack.stackBottom) {

        System.out.println("关注公众号:Java3y---->该栈为空");
    } else {

        System.out.println("关注公众号:Java3y---->该栈不为空");

    }

}

/**
 * 出栈(将栈顶的指针指向下一个节点)
 * @param stack
 */
public static void popStack(Stack stack) {

    // 栈不为空才能出栈
    if (!isEmpty(stack)) {

        //栈顶元素
        Node top = stack.stackTop;

        // 栈顶指针指向下一个节点
        stack.stackTop = top.next;

        System.out.println("关注公众号:Java3y---->出栈的元素是:" + top.data);

    }
}

/**
 * 清空栈
 * @param stack
 */
public static void clearStack(Stack stack) {

    stack.stackTop = null;
    stack.stackBottom = stack.stackTop;
}

队列

先进先出(LILO, Last In Last Out)

静态队列

数组实现循环队列,节省内存资源

public class Queue {


    //数组
    public int [] arrays;

    //指向第一个有效的元素
    public int front = 0;

    //指向有效数据的下一个元素(即指向无效的数据)
    public int rear = 0;

}


/**
 * 入队
 *
 * @param queue
 */
public static void enQueue(Queue queue,int value) {

    // 不是满的队列才能入队
    if (!isFull(queue)) {

        // 将新的元素插入到队尾中
        queue.arrays[queue.rear] = value;

        // rear节点移动到新的无效元素位置上
        queue.rear = (queue.rear + 1) % queue.arrays.length;
    }
}

/**
 * 出队
 *
 * @param queue
 */
public static void outQueue(Queue queue) {

    //判断该队列是否为null
    if (!isEmpty(queue)) {


        //不为空才出队
        int value = queue.arrays[queue.front];
        System.out.println("关注公众号:Java3y--->出队的元素是:" + value);

        // front指针往后面移
        queue.front = (queue.front + 1) % queue.arrays.length;

    }


}

/**
 * 判断队列是否空,front和rear指针相等,就是空了
 * @param queue
 * @return
 */
public static boolean isEmpty(Queue queue) {
    if (queue.rear  == queue.front) {
        System.out.println("关注公众号:Java3y--->此时队列空的!");
        return true;
    } else {
        System.out.println("关注公众号:Java3y--->此时队列非空!");
        return false;
    }
}
        
/**
 * 判断队列是否满了,front和rear指针紧挨着,就是满了
 * @param queue
 * @return
 */
public static boolean isFull(Queue queue) {
    if ((queue.rear + 1) % queue.arrays.length == queue.front) {

        System.out.println("关注公众号:Java3y--->此时队列满了!");
        return true;
    } else {
        System.out.println("关注公众号:Java3y--->此时队列没满了!");
        return false;
    }
}

/**
 * 遍历队列
 * @param queue
 *
 */
public static void traverseQueue(Queue queue) {

    // front的位置
    int i = queue.front;

    while (i != queue.rear) {

        System.out.println("关注公众号:Java3y--->" + queue.arrays[i]);

        //移动front
        i = (i + 1) % queue.arrays.length;
    }

}
    

动态队列

链表实现