91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用swift語言實現有效括號的判斷

發布時間:2022-01-13 15:03:51 來源:億速云 閱讀:184 作者:iii 欄目:大數據

這篇文章主要介紹了怎么用swift語言實現有效括號的判斷的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇怎么用swift語言實現有效括號的判斷文章都會有所收獲,下面我們一起來看看吧。

1.開篇問題:有效的括號[1]

怎么用swift語言實現有效括號的判斷

假如現在要你來解這道題,你會想到怎樣的解法了?

這就要用到我們今天要講的“棧”這種數據結構。帶著這個問題,我們來學習今天的內容。

2.如何理解“棧”?

    關于棧,有一個非常貼切的游戲--漢諾塔。玩這個游戲的時候,我們都是從下往上一個一個放;取的時候,我們也是從上往下一個一個地依次取,不能從中間任意抽出。后進者先出,先進者后出,這就是典型的“棧”結構
   
 從棧的操作特性上來看,棧是一種“操作受限”的線性表,只允許在一端插入和刪除數據。
棧的定義[2]  
 
     棧(stack)又名堆棧,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。

3.如何實現棧

    從剛才棧的定義里,我們可以看出,棧主要包含兩個操作,入棧和出棧,也就是在棧頂插入一個數據和從棧頂刪除一個數據。理解了棧的定義之后,我們來看一看如何用代碼實現一個棧。
  【本文使用    swift  語言來編寫代碼,讀者朋友們不要因為編程語言不同而有畏難情緒,重要的是思維和邏輯,語言只是表達方式。你可以用你自己熟悉的語言來表達你的邏輯,可以先試著寫一寫】
Talking is cheap,show you the code.
  
class Stack {
   //初始化數組
   var datas = [Int]()
   //出棧操作
   func pop() -> Int? {
       return datas.popLast()
   }
   //入棧操作
   func push(obj: Int) {
       datas.append(obj)
   }
   //棧頂對象
   func top() -> Int? {
       return datas.last
   }
}

4.棧在實際開發過程中的應用

  • 棧在函數調用中的應用

  
  
  
func calculate() {
   let a = 3
   let b = 5
   var result = 0
   result = add(x: a, y: b)
   print(result)
}

func add(x: Int, y: Int) -> Int {
   var sum= 0
   sum = x + y
   return sum
}
     
    從代碼中我們可以看出,calculate() 函數調用了 add() 函數,傳入臨時變量a和b,獲取計算結果,最后打印 result 的值。
    為了讓你清晰地看到這個過程對應的函數棧里出棧、入棧的操作,我畫了一張圖。圖中顯示的是,在執行到 add() 函數時,函數調用棧的情況。  
  • 遞歸

    在算法中,經常會使用的一個思想就是遞歸思想。很著名的就是斐波那契數列  [3]
F(0) =0,
F(1) =1,
F(n) = F(n-1)+F(n-2)(n≥2,n∈N*)
計算  F(n)  時需要先計算  F(n-1)  和  F(n-2)  
計算  F(n-1)  時需要先計算  F(n-2)  和  F(n-3)  
計算  F(n-2)  時需要先計算  F(n-2)  和  F(n-3)  
 ···
最后的效果是,會有很多中間值壓入棧中,這也是為什么,當  n  很大的時候,會非常消耗內存。所以在實際的開發中,掌握這些底層的開發基礎,會有助你選擇合適的技術方案。

5.概念區分:數據結構堆棧 VS 內存中的堆棧

    在學習計算機基礎的時候,我們知道內存中有棧區和堆區。那它與數據結構中的堆棧有什么區別了,它們是同一個概念嗎?
    內存中的堆棧數據結構堆棧不是一個概念,可以說內存中的堆棧是真實存在的物理區,數據結構中的堆棧是抽象的數據存儲結構。
    內存空間在邏輯上分為三部分:代碼區、靜態數據區和動態數據區,動態數據區又分為棧區和堆區。
    代碼區:存儲方法體的二進制代碼。高級調度(作業調度)、中級調度(內存調度)、低級調度(進程調度)控制代碼區執行代碼的切換。
    靜態數據區:存儲全局變量、靜態變量、常量,常量包括final修飾的常量和String常量。系統自動分配和回收。
    棧區:存儲運行方法的形參、局部變量、返回值。由系統自動分配和回收。
    堆區:new一個對象的引用或地址存儲在棧區,指向該對象存儲在堆區中的真實數據。

6.解答開篇

    好了,我想現在你已經完全理解了棧的概念。我們再回來看看開篇的思考題,如何實現有效括號的判斷?其實使用棧的思想就可以非常完美的解決這個問題。
我們開始分析:
  • 1.如果開始就是右括號 )、]、} ,很明顯不合法,直接返回false
  • 2.如果是左括號  (、[、{ ,就壓棧。如果是右括號 )、]、} ,在stack有值的情況下與棧頂元素匹配,匹配通過則棧頂元素出棧,否則直接返回false。
下面是  swift  解題的實現代碼
  
  
  
class Solution {
     
   func isValid(_ s: String) -> Bool {
       
       if s.count == 0  { return false }
       var stack = [String]()
       let dict: [String:String] = ["(":")","[":"]","{":"}"]
       
       for c in s {
           if dict.keys.contains(c.description) {
               stack.append(c.description) //如果是左括號就入棧
           }else {
               if stack.count > 0 && c.description == dict[stack.last!] { //如果是右括號,并且匹配就出棧
                   stack.removeLast()
               }else {
                   return false
               }
           }
       }
       return stack.count == 0
   }
}
     
在LeetCode上也有很多種語言的解法,這里分享一個python  [4]  的解法

關于“怎么用swift語言實現有效括號的判斷”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“怎么用swift語言實現有效括號的判斷”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

九台市| 竹溪县| 邯郸县| 济阳县| 华宁县| 金门县| 辉南县| 库车县| 武宁县| 达拉特旗| 青冈县| 霸州市| 合作市| 巨野县| 修水县| 商丘市| 河津市| 上栗县| 云阳县| 监利县| 敦化市| 贡觉县| 渭南市| 措勤县| 墨竹工卡县| 广饶县| 响水县| 永嘉县| 科技| 友谊县| 藁城市| 乃东县| 四会市| 新蔡县| 兴化市| 渝中区| 阿合奇县| 和田县| 浦江县| 花莲县| 江西省|