1. 程式人生 > >資料結構(三)——線性結構之棧

資料結構(三)——線性結構之棧

1.棧是限定僅在表頭進行插入和刪除操作的線性表。

  棧相當於一個箱子,然後往箱子裡一層一層的放東西,最先放的最後取,先進後出。

  入口的一端為棧頂,另一端稱作棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。

2.對棧的操作

棧我們可以想像成一個數組,每次插入插入在陣列的最後一位,取也從最後一位來取。

棧主要的操作有以下幾個:

(1)入棧(也成壓棧);

(2)出棧;

(3)檢視棧頂元素;

(4)判斷棧是否為空。

package cn.kimtian.array.stack;

import java.util.Arrays;

/**
 * 對棧的操作
 * 由於棧有先進後出的特性
 * 所以我們考慮若 每次為陣列增加元素,加在陣列的最後一位,每次取資料也從陣列的最後一位取。
 * 就保證了先進後出。實現了棧的特性。
 *
 * @author kimtian
 */
public class MyStack {
    /**
     * 棧的底層我們使用陣列來儲存資料
     */
    int[] elements;

    public MyStack() {
        elements = new int[0];
    }


    /**
     * 壓入元素方法
     *
     * @param element 入棧資料
     */
    public void pushStack(int element) {
        // 建立一個新的陣列
        int[] newArr = new int[elements.length + 1];
        // 把原陣列中的元素複製到新的陣列中
        for (int i = 0; i < elements.length; i++) {
            newArr[i] = elements[i];
        }
        // 把新增的元素放入新陣列中
        newArr[elements.length] = element;
        // 使用新陣列替換老陣列
        elements = newArr;
    }

    /**
     * 取出棧頂元素
     */
    public int popStack() {
        // 棧是空的
        if (elements.length == 0) {
            throw new RuntimeException("stack is empty!");
        }

        // 取出陣列的最後一個元素
        int element = elements[elements.length - 1];
        // 建立一個新的陣列
        int[] newArr = new int[elements.length - 1];
        // 把原陣列中除了最後元素的其他元素都放入新陣列中
        for (int i = 0; i < newArr.length; i++) {
            newArr[i] = elements[i];
        }
        // 使用新陣列替換老陣列
        elements = newArr;
        // 返回棧頂元素
        return element;
    }

    /**
     * 檢視棧頂元素
     */
    public int peekStack() {
        // 棧是空的
        if (elements.length == 0) {
            throw new RuntimeException("stack is empty!");
        }
        // 取出陣列的最後一個元素
        int element = elements[elements.length - 1];
        return element;
    }

    /**
     * 判斷棧是否為空
     */
    public boolean isStackEmpty() {
        return elements.length == 0;
    }
}