日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构链表之栈——解决括号匹配问题和逆波兰表达式求值问题——6

發布時間:2024/7/5 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构链表之栈——解决括号匹配问题和逆波兰表达式求值问题——6 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

括號匹配問題和逆波蘭表達式求值問題

基于上一節已經使用python代碼對棧進行了簡單的實現,這一節我們在其基礎上解決兩個常見的問題

案例

  • 括號匹配問題(點我直接到代碼實現)
  • 逆波蘭表達式求值問題(點我直接到代碼實現)
  • 括號匹配問題

    在給定的字符串中,編寫程序實現確定該字符串類的括號是否匹配的問題

    使用棧解決這個問題的思路:


    括號匹配python代碼實現

    from Structure.linear.Stack import Stackdef is_matched_brackets(_str=None):stack = Stack()for s in _strs:# If the sub-str is '(', push it into the stackif s == '(':stack.push(s)# If it is ')', try to pop a '(' from the stackelif s == ')':pop_a_left = stack.pop()# If hadn't popped a '(', return falseif not pop_a_left:return Falseif stack.len == 0:return Truereturn False# _strs = "()(Shanghai)(Changan))(" # _strs = "())(" _strs = "(())()" print(f"Is the brackets matched in {_strs} ? {is_matched_brackets(_strs)}")

    然后這里導入的Stack是上一節棧的實現寫的代碼,也就使用到了pop和push的方法以及len屬性,代碼量也不算很多,我就直接復制過來了,方便查看,這里功能實現起來也是非常的簡單,就不做過多贅述來解釋了。

    class Node:def __init__(self, item):self.item = itemself.next = Noneclass Stack:def __init__(self):self.head = Noneself.len = 0def is_empty(self):return not self.len# def length(self):# return self.lendef push(self, item):"""Push an element into the stack"""node = Node(item)node.next = self.headself.head = nodeself.len += 1def pop(self):"""Pop a value from the stack top"""# if not self.head:# raise IndexError("pop from empty list")cur = self.headif self.head:self.head = self.head.nextself.len -= 1return cur

    逆波蘭表達式

    在定義逆波蘭表達式求值問題之前,我們先來看一下中綴表達式是什么:

    • 定義:中綴表達式是一個通用的算術或邏輯公式表示方法,二元運算符總是會在兩個操作數的中間

    舉個栗子:

    • 例如:1 + 3 * 2和2 - ( 1 + 3 ),運算符(+ - * /)都是在兩個值的中間

    這種表達式雖然對于我們人類來說觀看和使用起來都是非常簡單的,但是對于計算機并不太友好,這是因為這種表達式并不是有順序的,在運算時還可能涉及到很多優先級順序的判斷

    因此我們引入了中綴表達式轉后綴表達式的概念,這里的后綴表達式就是我們所說的逆波蘭表達式

    • 簡介:逆波蘭式(Reverse Polish notation,RPN,或逆波蘭記法),也叫后綴表達式(將運算符寫在操作數之后)

    逆波蘭表達式的定義描述看起來晦澀難懂,簡單的說就是將運算符寫在操作數之后的表達式,對定義描述感興趣的同學可以自行百度一下,這里我們用幾個例子直觀的感受一下

    通過結果看轉換前的狀態會比較好理解:

  • a + b → ab+,先看操作符,一個操作符對應兩個值,加號+對應a 和 b相加得到a+b
  • a + (b - c) → abc-+,先看操作符,一個操作符對應兩個值,減號-對應離他最近的bc,因此先計算b - c,再看加號+,也對于兩個值,就是a 和 (b - c),因此為 a + (b - c)
  • a + (b -c) * d → abc-d*+,先看操作符,秉承操作運算的先后順序,減號-對應b - c,然后乘號*對應的是(b - c)*d,最后加號+對應的也是兩個值a 和 (b - c)*d相加即可得到a + (b - c) * d
  • a * (b - c) + d → abc-*d+,同樣,以操作符為中心尋找數字,減號-對應b 和 c相減得到(b - c),乘號*對應a 和 (b - c)相乘得到a * (b - c),加號+對應a * (b - c)和 d,相加得到結果 a * (b - c) + d
  • 代碼實現思路:

    • 如果當前字符為變量或者為數字,則壓棧,如果是運算符,則將棧頂兩個元素彈出作相應運算,結果再入棧,最后當表達式掃描完后,棧里的就是結果。

    實現流程圖:


    python代碼實現
    這里先要寫一個實現棧的類方法:(也可以參照前期的棧實現文章)

    class Node:def __init__(self, item):self.item = itemself.next = Noneclass Stack:def __init__(self):self.head = Noneself.len = 0def is_empty(self):return not self.len# def length(self):# return self.lendef push(self, item):"""Push an element into the stack"""node = Node(item)node.next = self.headself.head = nodeself.len += 1def pop(self):"""Pop a value from the stack top"""# if not self.head:# raise IndexError("pop from empty list")cur = self.headif self.head:self.head = self.head.nextself.len -= 1return cur from Structure.linear.Stack import Stackdef reverse_polish_notation(_strs):nums = Stack()for s in _strs:if s not in ['+', '-', '*', '/']:nums.push(s)else:num1 = nums.pop().itemnum2 = nums.pop().item# This equals to num2 [+-*/] num1res = eval(str(num2)+s+str(num1))nums.push(res)return nums.pop().item# 2*(18-13)-12/4 = 2*5 - 3 = 7 _strs = '2', '18', '13', '-', '*', '12', '4', '/', '-' result = reverse_polish_notation(_strs) print(f"The computation of {_strs} is {2*(18-13)-12/4}") print(f"The result is {result}")

    運行結果:

    The computation of ('2', '18', '13', '-', '*', '12', '4', '/', '-') is 7.0 The result is 7.0

    實現過程比較簡單,就不過多贅述了

    總結

    以上是生活随笔為你收集整理的数据结构链表之栈——解决括号匹配问题和逆波兰表达式求值问题——6的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。