數據結構~棧入門

一:棧的介紹

  1. 棧的英文名爲:stack
  2. 棧是一個先入後出的有序列表
  3. 棧是限制性表,表中的元素只能夠在線性表的一端進行插入,獲取元素,這一端爲允許變化的一端,成爲棧頂(Top),另一端則稱爲棧底。
  4. 根據棧的定義可以知道,最先放入棧中的數據是在棧的最底層,最後放的元素則是在棧頂,因此每次對元素進行操作,只能從棧頂開始,刪除,獲取等操作,棧不支持隨機訪問。
  5. 將數據放到棧中叫做壓棧(push),將元素從棧中取出稱爲將元素從棧中彈出(pop)

使用數據實現棧:

package cn.littleworm.Array.pojo;
  /*
        創建一個棧的思路(使用數組實現)
            1、定義一個棧頂指針,初始化爲-1
            2、將數據壓入棧pop
            3、將數據彈出棧
            4、顯示棧中的數據
            5、判斷棧是否爲空或棧滿

     */

public class ArrayStarck {
    //定義全局屬性:棧頂指針
    private int top = -1;
    private int maxsize;
    private int[] stack;

    //創建構造器
    public ArrayStarck(int maxsize){    //maxsize是數組的長度

        this.maxsize = maxsize;
        //創建數組
        stack = new int[this.maxsize];
    }

    //判斷棧是否爲空
    public boolean isEmpty(){
        return top == -1;
    }

    //判斷棧是否已滿
    public boolean isFull(){
        return top == maxsize-1;
    }

    //壓棧
    public void push(int value){
        //判斷是否已滿
        if (isFull()){
            System.out.println("棧已滿");
            return;
        }
        top++;
        stack[top] = value;
    }

    //彈棧
    public int pop(){
        //判讀是否爲空
        if (isEmpty()){
            //拋出異常
            System.out.println("棧爲空,請先輸入數據");
            return 0;
        }
        //用來接收數據
        int value;
        value = stack[top];
        //將top減一
        top--;
        return value;
    }

    //顯示棧中數據
    public void showList(){
        //判斷棧中是否有數據
        if (isEmpty()){
            System.out.println("棧爲空,請先輸入數據");
            return;
        }
        //循環遍歷
        for (int i=top;i>=0;i--){
            System.out.println(stack[i]);
        }

    }

}

測試

package cn.littleworm.Array.pojo;

import java.util.Scanner;

public class ArrayStrackDemo {

    public static void main(String[] args) {

        ArrayStarck arrayStarck = new ArrayStarck(4);

        String key ;
        boolean flag = true;
        Scanner scanner = new Scanner(System.in);

        while (flag){
            System.out.println("show:表示顯示棧中數據");
            System.out.println("pop:表示向棧中添加數據");
            System.out.println("pulsh:表示從棧中彈出一個數據");
            System.out.println("exit:退出程序");
            System.out.print("請輸入你的選擇:");
            key = scanner.next();

            switch (key){
                case "show":
                    arrayStarck.showList();
                    break;
                case "pop":
                        int pop = arrayStarck.pop();
                        System.out.println("彈出數據是:"+pop);
                        break;
                case "pulsh":
                    System.out.println("請輸入數據:");
                    int i = scanner.nextInt();
                    arrayStarck.push(i);
                    break;
                case "exit":
                    scanner.close();
                    flag = false;
            }
        }
    }
}

使用單鏈表實現棧

package cn.littleworm.list.pojo;

public class Node {


    private int data;
    public Node next;

    //構造器
    public Node(int data){
        this.data = data;
    }

    //空參構造
    public Node(){}

    //toString方法

    @Override
    public String toString() {
        return
                "data=" + data;
    }

    public int getData() {
        return data;
    }

    public void setData(int data) {
        this.data = data;
    }
}
package cn.littleworm.list.pojo;

public class ListStrack {
    /*
    思路:
        1、每次添加就按照倒序進行插入
        2、進行刪除,刪除head後面的結點
        3、展示,遍歷倒序後的鏈表
     */
    private Node head = new Node(0);

    //插入
    public void push(int data){
        //創建一個結點
        Node newNode = new Node(data);
        if (head.next == null){
            head.next = newNode;
        }else {
            newNode.next = head.next;
            head.next = newNode;
        }
    }

    //刪除
    public void pop() {
        //判斷
        if (head.next == null) {
            System.out.println("棧爲空,請先輸入數據");
            return;
        }
       head.next = head.next.next;
    }

    //展示
    public void showList(){
        //判讀
        if (head.next == null){
            System.out.println("棧爲空,請先輸入數據");
            return;
        }
        //定義一個輔助指針
        Node f = head.next;
        while (true){
            System.out.println(f.getData());
            if (f.next==null){
                break;
            }
            f = f.next;
        }
    }
}

package cn.littleworm.list.pojo;


import java.util.Scanner;

public class Test {
    public static void main(String[] args) {

        ListStrack listStrack = new ListStrack();

        boolean flag = true;
        String key;
        Scanner scanner = new Scanner(System.in);

        while (flag){
            System.out.println("push:向棧中壓數據");
            System.out.println("pop:將棧中的數據彈出");
            System.out.println("show:顯示棧中的數據");
            System.out.println("exit:退出程序");
            System.out.println("請選項:");
            key = scanner.next();

            switch (key){
                case "push":
                    System.out.println("請輸入要壓如的數據:");
                    int data = scanner.nextInt();
                    listStrack.push(data);
                    break;
                case "pop":listStrack.pop();break;
                case "show":listStrack.showList();break;
                case  "exit":scanner.close();flag = false;
            }
        }

    }
}

發佈了26 篇原創文章 · 獲贊 5 · 訪問量 4171
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章