1. 程式人生 > >[資料結構與演算法] 5,棧的應用-四則運算表示式求值

[資料結構與演算法] 5,棧的應用-四則運算表示式求值

1,字尾(逆波蘭)表示法定義

計算器可以幫忙計算一些簡單的加減乘除,但是如果遇到一些比較複雜的,比如說有大中小括號的四則運算,那麼一些普通的計算器就無法實現運算了,但是觀察發現,所有的括號都是成對出現的,大中小括號其實也是巢狀的。

有了字尾表達法,我們可以把9 + ( 3 - 1 ) * 3 + 10 / 2表示為9 3 1 - 3 * + 10 2 / +,從左到右,遇到運算子號就將前面兩個數字進行運算,用棧來解釋就是:

從左到右,遇到數字就進棧,遇到運算子就將棧頂兩個元素進行運算,運算結果再進棧,如下圖:


那麼我們如何將其轉化為字尾表示式呢?以中綴表示式9 + ( 3 - 1 ) * 3 + 10 / 2作為例子。

規則:從左到右遍歷中綴表示式每個數字跟符號,如果是數字就輸出,也就是成為字尾表示式的一部分,如果是符號,那麼就判斷其與棧頂符號的優先順序,是右括號或者優先順序沒有比棧頂元素高(入棧的始終都是優先順序比棧頂元素大的,比如乘除大於加減),那麼就把棧頂元素出棧。

1,初始化一個空棧,用來對符號進棧或者出棧使用。遇到數字都是直接輸出的,所以下面輸出9,+入棧

2,接下來遇到  ( 左括號,入棧,遇到數字3輸出,遇到 - 減號入棧,遇到數字1輸出

3,接下來遇到右括號),跟前面的左括號進行配對,所以 - 減號出棧輸出,所以現在表示式變成 ”9 3 1 -“ , 棧中剩下 + 號

4,接下來遇到乘號*,跟棧頂元素 + 對比,乘號優先順序比較高,所以乘號入棧,然後遇到數字3輸出,如下圖:

5,接下來遇到 + 加號,對比棧頂元素,優先順序沒有棧頂元素高,所以,棧頂的*乘號先出棧,緊接著的+加號優先順序跟即將要入棧的 + 加號優先順序一樣,所以棧中的 + 加號出棧,即將入棧的加號入棧(9 + ( 3 - 1 ) * 3 +,也就是最後面那個)。也就是說,現在輸出的加號是前面入棧的加號。

6,接下來遇到10,直接輸出,遇到除號入棧(除號的優先順序高於棧中的加號,入棧的始終都是優先順序比棧頂高),如下圖

7,最後一個數字是2,直接輸出,已經沒有其與的中綴表示式符號了,棧中所有的符號(/ +)出棧,那麼字尾表示式完成

從上面的這個過程,我們得出一個總結:

1 將中綴表示式轉化成字尾表示式(棧用來進出運算的符號)

2 將字尾表示式進行運算得出結果 (棧用來進出運算的數字)

相關推薦

[資料結構演算法] 5應用-四則運算表示式

1,字尾(逆波蘭)表示法定義 計算器可以幫忙計算一些簡單的加減乘除,但是如果遇到一些比較複雜的,比如說有大中小括號的四則運算,那麼一些普通的計算器就無法實現運算了,但是觀察發現,所有的括號都是成對出

資料結構演算法》之應用

1、字串的翻轉(逆序) 根據棧“後進先出”的特點,可以利用棧對字串進行反轉,即實現字串的逆序。 藉助於《資料結構與演算法》之棧(2)中的棧結構,相應實現的程式碼如下: public static void ReverString() { BigStack stac

修煉內功---資料結構演算法5---

<?php /** * 通過 PHP 陣列實現簡單的順序棧 */ class SimpleStack { private $_stack = []; private $_size = 0; public function __construct($size =

資料結構演算法】之的基本介紹及其陣列、連結串列實現---第四篇

一、棧的基本介紹 1、棧的基本概念 棧是一種限制在一端進行插入和刪除操作的線性表資料結構。棧中有兩個比較重要的操作:push(壓棧:將元素壓入棧頂)和pop(彈棧:從棧頂彈出一個元素)。都滿足先進後出、後進先出的特點! 從圖中可以看出,我們常把棧的上面稱為棧

資料結構演算法(5) -- deque

vector是單向開口的連續線性空間,deque則是一種雙向開口的連續線性空間。所謂雙向開口,意思是可以在頭尾兩端分別做元素的插入和刪除操作。stl中deque與vector最大的差異,一在於deque允許常數時間對頭端進行元素的插入操作;二是其由分段連續空間組合而成。 這

資料結構演算法分析 - 2 - ADT

1.描述:實質是一種受到限制的表,即插入刪除只能在表的末端,能夠實現LIFO(後進先出) 2.棧的實現   連結串列實現(鏈棧)   陣列實現(順序棧)   3.鏈棧 建立一個空棧 1 struct Node 2 { 3 int value; 4 N

資料結構演算法-5大常用演算法總結

1.貪心演算法 基本思想:貪心演算法分階段工作,在每一階段,可以認為所做的決定是好的,而不考慮將來的後果。意味著選擇的是區域性最優,如果剛好是全域性最優則演算法正確,否則得到的是一個次優解。所有可以應用於不需要得到最佳答案,用貪心演算法生成近似答案。 1

資料結構演算法之七

視訊課堂https://edu.csdn.net/course/play/7621 目標 在本章中 , 你將學到 : 識別棧的特性 實施棧

JS資料結構演算法 —— 集合並集交集補集

概念:集合是由一組無序且唯一(每個元素只出現一次)的項組成的一組資料。其與數學裡的集合是同一個概念。在ES6裡已經引入了集合的資料結構概念——Set類。 分類:常見的有空集,並集,交集,差集。 應用場景:1)資料去重;2)用於儲存一些獨一無二的資料。 js實現一個集合 集合的特性

資料結構應用---四則運算表示式(中綴表示式字尾表示式轉換)

用計算機實現帶括號的四則運算的方式。 這裡的困難在於乘除運算的優先順序高於加減運算,並且加入了括號,使得問題變得更加困難。 20世紀50年代,波蘭邏輯學家想到了一種不需要括號的字尾表達法,我們也把它稱為逆波蘭表示。 比如:9+(3-1)*3+10/2,如果

Java資料結構演算法之stack

目錄:1.棧概述2.陣列實現自定義棧3.連結串列實現自定義棧4.集合實現自定義棧 1.棧概述棧和佇列一樣,也是線性表的一種,它唯一的特點是需要滿足先進後出(FILO)的規則,也就是隻能對棧的一頭進行操作,新增資料 稱為壓棧,移除資料稱為彈棧。而在java中棧的實現可以通過陣

JavaScript 資料結構演算法之美 - 記憶體堆記憶體 、淺拷貝深拷貝

前言 想寫好前端,先練好內功。 棧記憶體與堆記憶體 、淺拷貝與深拷貝,可以說是前端程式設計師的內功,要知其然,知其所以然。 筆者寫的 JavaScript 資料結構與演算法之美 系列用的語言是 JavaScript ,旨在入門資料結構與演算法和方便以後複習。 棧 定義 後進者先出,先進者後出,簡

java應用表示式

原始碼的github地址,可以下載到本地執行 package stack.demo; import java.io.IOException; import java.util.Scanner; import java.util.Stack; /** * 表示式求值 算符優先

應用-四則運算表示式

Java實現四則運算表示式求值 前言 最近在複習資料結構與演算法,在棧的應用中瞭解到計算機計算四則運算表示式的演算法。 計算機計算四則運算主要分兩步: 將中綴表示式轉化為字尾表示式; 將字尾表示式進行運算得出結果。 字尾(逆波蘭)表示式

應用--四則運算表示式(java語言)

棧的應用–四則運算表示式求值(java語言) 前言 在複習資料結構的過程中,採用單鏈表實現了棧Stack,具體功能有如下幾個功能:判斷其是否為空棧、輸出棧的長度、入棧、出棧並且實現Iterable藉口,可以採用Iterator遍歷棧。在測試了棧之後,覺得應該

資料結構中 線性表佇列演算法之間的聯絡區別

一。連結串列為什麼需要         在程式中,經常需要將一種(通常是同為某個型別的)資料元素作為整體管理和使用,需要建立這種元素組,用變數記錄他們,傳進傳出函式等。一組元素可能發生變化(像增加或刪除元素。)      

資料結構演算法A》實驗2:應用

題目: Description 根據棧的特點,實現十進位制到其他進位制之間的轉換,具體要求如下: (1)利用棧進行十進位制數與N進位制(如二進位制、八進位制、十六進位制)資料之間的轉換; (2)通過順序棧記錄進位制轉換的中間結果,該順序棧有一個指示棧頂的變數top,

2017級軟體工程專業《資料結構演算法A》實驗2:應用

題目: Description 根據棧的特點,實現十進位制到其他進位制之間的轉換,具體要求如下: (1)利用棧進行十進位制數與N進位制(如二進位制、八進位制、十六進位制)資料之間的轉換; (2)通過順序棧記錄進位制轉換的中間結果,該順序棧有一個指示棧頂的變數top,

資料結構演算法 -- 應用(進位制轉換、括號匹配)

棧的應用 ps:用棧很簡單實現的應用有很多,比如說進位制轉換,括號匹配等。學計算機的都知道,2進位制,8進位制,10進位制,16進位制等,進位制之間的轉換也是需要掌握的,以備不時之需,所以我們可以自己寫一段程式如果會android的話,可以直接打包成APK。下面就按照這兩個應用稍微寫一點C語言的程式碼。 進

資料結構演算法——應用舉例(3例)

根據“後進先出”特性,生活中的例子比比皆是。 1數制轉換 假設要講十進位制轉換為二進位制。以 52 為例,如圖: 在上述計算過程中,第一次求出的X值為最低位,最後一次求出的X值為最高位。而列印時