算法通关村第四关-青铜挑战基于链表完成栈

大家好我是苏麟 , 今天聊聊.

本期大纲

    • 栈的基础知识
      • 栈的特征
      • 栈的操作
      • Java中的栈
    • 基于链表实现栈

栈的基础知识

栈的特征

栈和队列是比较特殊的线性表,又称之为访问受限的线性表。栈是很多表达式、符号等运算的基础,也是递归的底层实现。理论上递归能做的题目栈都可以,只是有些问题用栈会非常复杂。

栈底层实现仍然是链表或者顺序表,栈与线性表的最大区别是数据的存取的操作被限制了,其插入和删除操作只允许在线性表的一端进行。

更好的理解栈 :

我们需要先举一个生活中的例子。栈就好比一个长的圆筒,圆筒一端封闭,另一端开口。往圆筒里放入乒乓球,先放入的靠近圆筒底部,后放入的靠近圆筒入口。
算法通关村第四关-青铜挑战基于链表完成栈_第1张图片
那么,要想取出这些乒乓球,则只能按照和放入顺序相反的顺序来取,先取出
后放入的,再取出先放入的,而不可能把最里面最先放入的乒乓球优先取出。
算法通关村第四关-青铜挑战基于链表完成栈_第2张图片
栈中的元素只能先入后出(First In Last Out,简称FILO)。最早进入的元素存放的位置叫作栈底(bottom),最后进入的元素存放的位置叫作栈顶(top).

栈的操作

入栈(压栈)

入栈操作(push)就是把新元素放入栈中,只允许从栈顶一侧放入元素,新元
素的位置将会成为新的栈顶。

算法通关村第四关-青铜挑战基于链表完成栈_第3张图片

出栈(弹栈)

出栈操作(pop)就是把元素从栈中弹出,只有栈顶元素才允许出栈,出栈元素
的前一个元素将会成为新的栈顶。

算法通关村第四关-青铜挑战基于链表完成栈_第4张图片

Java中的栈

栈的常用方法主要有 :

  • push(E):增加一个元素E
  • pop0:弹出元素E
  • peek0:显示栈顶元素,但是不出栈
  • empty0:判断栈是否为空

我们在设计自己的栈的时候,不管用数组还是链表,都要实现上面几个方法

java的util中就提供了栈Stack类,使用不复杂,看一个例子就够了 .

   public static void main(String[] args) {
      Stack theStack = new Stack(); 
      theStack.push(10);
      theStack.push(20);
      theStack.push(30);
      theStack.push(40);
      theStack.push(50);
      while (!theStack.isEmpty()) {
         long value = theStack.pop();
         System.out.print(value);
         System.out.print(" ");
      }
      System.out.println("");
   }

基于链表实现栈

链表也可以实现栈,插入和删除都在头结点进行就可以了

算法通关村第四关-青铜挑战基于链表完成栈_第5张图片
简单的写了一下 , 大家可以根据自己的想法和业务逻辑自己编写

代码 :

package src.sl.stack;

public class MyStack {

    private static Node head = new Node(-100, null);

    /**
     * 节点
     */
    private static class Node {
        Integer val;
        Node next;

        public Node(Integer val, Node node) {
            this.val = val;
            this.next = node;
        }
    }


    /**
     * 压栈
     * @param value
     */
    public void push(Integer value) {
        //创建节点
        Node node = new Node(value, null);
        node.next = head.next;
        head.next = node;
    }


    /**
     * 判断是否为空
     * @return
     */
    public boolean empty(){
        if (head.next == null){
            return true;
        }
        return false;
    }

    /**
     * 返回当前元素的值
     * @return
     */
    public Integer peek(){
        if (head.next == null){
            return null;
        }
        return head.next.val;
    }

    /**
     * 删除栈顶元素 返回值
     * @return
     */
    public Integer pop(){
        boolean flag = empty();
        if (flag){
            return null;
        }
        int val = head.next.val;
        head.next = head.next.next;
        return val;
    }

}

测试 :

package src.sl.stack;

public class MyStackTest {
    public static void main(String[] args) {
        MyStack myStack = new MyStack();
        myStack.push(1);
        myStack.push(2);
        myStack.push(3);
        myStack.push(4);


        while (!myStack.empty()){
            int peek = myStack.peek();
            System.out.println(peek);
            int pop = myStack.pop();
            System.out.println(pop);
        }

    }
}

这关就到这里 , 下一关见!

你可能感兴趣的:(算法村,算法,链表,数据结构,后端)