棧的應用場景思路分析和程式碼實現

victorfengming發表於2021-03-04

棧的一個實際需求

請輸入一個表示式 計算式:[7*2*2-5+1-5+3-3] 點選計算【如下圖】

img

請問: 計算機底層是如何運算得到結果的? 注意不是簡單的把算式列出運算,因為我們看這個算式 7 2 2 - 5, 但是計算機怎麼理解這個算式的(對計算機而言,它接收到的就是一個字串),我們討論的是這個問題。-> 棧

棧的介紹

  • 棧的英文為(stack)
  • 棧是一個先入後出(FILO-First In Last Out)的有序列表。
  • 棧(stack)是限制線性表中元素的插入和刪除只能線上性表的同一端進行的一種特殊線性表。允許插入和刪除的一端,為變化的一端,稱為棧頂(Top),另一端為固定的一端,稱為棧底(Bottom)。
  • 根據棧的定義可知,最先放入棧中元素在棧底,最後放入的元素在棧頂,而刪除元素剛好相反,最後放入的元素最先刪除,最先放入的元素最後刪除
  • 出棧(pop)和入棧(push)的概念(如圖所示)

img img

棧的應用場景

  • 子程式的呼叫:在跳往子程式前,會先將下個指令的地址存到堆疊中,直到子程式執行完後再將地址取出,以回到原來的程式中。
  • 處理遞迴呼叫:和子程式的呼叫類似,只是除了儲存下一個指令的地址外,也將引數、區域變數等資料存入堆疊中。
  • 表示式的轉換[中綴表示式轉字尾表示式]與求值(實際解決)。
  • 二叉樹的遍歷。
  • 圖形的深度優先(depth一first)搜尋法。
package com.atguigu.stack;

import java.util.Scanner;

/**
 * ClassName:  <br/>
 * Description:  <br/>
 * Date: 2021-02-20 13:21 <br/>
 * @project data_algorithm
 * @package com.atguigu.stack
 */
public class ArrayStackDemo {


}

//定義一個 ArrayStack 表示棧
class ArrayStack {
    private int maxSize; // 棧的大小
    private int[] stack; // 陣列,陣列模擬棧,資料就放在該陣列
    private int top = -1;// top表示棧頂,初始化為-1

    //構造器
    public ArrayStack(int maxSize) {
        this.maxSize = maxSize;
        stack = new int[this.maxSize];
    }

    //棧滿
    public boolean isFull() {
        return top == maxSize - 1;
    }
    //棧空
    public boolean isEmpty() {
        return top == -1;
    }
    //入棧-push
    public void push(int value) {
        //先判斷棧是否滿
        if(isFull()) {
            System.out.println("棧滿");
            return;
        }
        top++;
        stack[top] = value;
    }
    //出棧-pop, 將棧頂的資料返回
    public int pop() {
        //先判斷棧是否空
        if(isEmpty()) {
            //丟擲異常
            throw new RuntimeException("棧空,沒有資料~");
        }
        int value = stack[top];
        top--;
        return value;
    }
    //顯示棧的情況[遍歷棧], 遍歷時,需要從棧頂開始顯示資料
    public void list() {
        if(isEmpty()) {
            System.out.println("棧空,沒有資料~~");
            return;
        }
        //需要從棧頂開始顯示資料
        for(int i = top; i >= 0 ; i--) {
            System.out.printf("stack[%d]=%d\n", i, stack[i]);
        }
    }

}
本作品採用《CC 協議》,轉載必須註明作者和本文連結
秋葉夏風

相關文章