1. 程式人生 > 其它 >棧在go語言中的實現,及解決LeetCode題目388. 檔案的最長絕對路徑的思路

棧在go語言中的實現,及解決LeetCode題目388. 檔案的最長絕對路徑的思路

今天在LeetCode刷每日一題,遇到了388. 檔案的最長絕對路徑的思路,這道題讓我想到了系統的目錄是棧結構,果然在題解中找到了棧的解法(暴力半天沒出來,跑去看題解了QWQ)。
所以我就捎帶複習了一下go語言中棧的實現,然後把這道題給理解一下

go語言棧的實現

  1. 較為簡單的實現(通過切片和內建函式)

     func main() {
       // int型別的棧
       stack := make([]int,10)
       // 壓棧 eg.壓入1
       stack = append(stack,1)
       // 出棧
       stack = stack(:len(stack)-1)
     }
    
  2. 看到網上一種。

    使用list(雙鏈表)的部分操作就可以達到stack操作的目的

    轉自 寇浩哲

       stack := list.New() //初始化棧
       ind := stack.Remove(stack.Front()).(int) //出棧
       stack.PushFront(i) //入棧
       fmt.Println(stack.Front().Value)
    

388. 檔案的最長絕對路徑的思路 題解

  1. 為什麼要用棧呢?
    因為題目的目錄是層級關係,如果遍歷到某個目錄的最後也沒找到檔案,肯定要返回到上一級去找另一個目錄

  2. /t的多少就是當前目錄的層級

  3. 其他操作在註釋裡很詳細了,就不再贅述

     func lengthLongestPath(input string) int {
         stack := []int{}
         l := len(input)
         ans := 0
         for i := 0;i < l;i++ {
             index := 1
             // 遇到/t遍歷有幾個/t 增加深度(一個/t相當於一級目錄)
             for ;i < l&& input[i] == '\t';i++ {
                 index++
             }
             length := 0
             isExt := 0
             // 遍歷當前目錄長度
             for ;i < l&& input[i] != '\n';i++{
                 if input[i] == '.' {
                     isExt = 1
                 }
                 length++
             }
             // 如果當前深度小於棧裡的目錄級數,說明棧裡的目錄已經到底了,需要退棧
             for index <= len(stack) {
                 stack = stack[:len(stack)-1]
             }
             // 如果不是第一級目錄,那麼就要多算一個/的長度,同時要把上一級的長度加到length裡
             if len(stack) > 0{
                 length += stack[len(stack)-1] + 1
             }
             //如果isExt == 1 說明已經找到檔案,判斷一下是不是最長的,如果不等於,把當前目錄長度給壓棧裡,方便下一次加到length裡
             if isExt == 1{
                 ans = max(ans,length)
             }else {
                 stack = append(stack,length)
             }
         }
         return ans
     }
    
     func max(a int,b int) int {
         if a > b {
             return a
         }else {
             return b
         }
     }