資料結構與演算法(六) 基於棧實現簡單的四則運算

2021-10-05 06:26:47 字數 2795 閱讀 4254

棧,是一種操作受限的線性表,其操作規則為:後進者先出,先進者後出。

目錄題目需求:

解題思路:

一、定義乙個棧

二、編寫四則運算**

三、測試結果

給定乙個字串,形如「1+6*5/3-8」,根據其內容,計算結果,此例結果為3。

1、去除空格字元、在運算子兩邊新增空格、分割成list(形如:['1', '+', '6', '*', '5', '/', '3', '-', '8'])。

2、申請兩個棧,分別用於存放數字、運算子。

3、從左到右每次讀取s中的乙個元素:

3.1、如果是數字,則轉化為整形壓入數字棧;

3.2、如果是運算子,則與當前運算子棧頂元素比較,優先順序大於棧頂元素則入棧;

3.3、優先順序小於等於當前棧頂元素,則:

3.3.1、取出兩個數字,與當前棧頂元素進行運算,結果壓入數字棧,

3.3.2、重複此過程,直到清空當前運算子棧;

3.4、然後,將當前運算子壓入運算子棧。

4、對最終的兩個棧,進行提取元素並計算得出最終結果。

class stack(object):

def __init__(self, max_length = 100):

self._max_length = max_length

self._stack =

self.count = 0

def push(self, x):

if self.count < self._max_length:

self.count += 1

def pull(self):

if self.count > 0:

x = self._stack.pop()

self.count -= 1

return x

return none

def sprint(self):

for c in self._stack:

print(c)

def arith_ont_step(a,b,op):

if op == '+':

return a+b

elif op == '-':

return a-b

elif op == '*':

return a*b

elif op == '/':

return a/b

def arithmetic(s):

"""根據給定四則運算的字串s,求其計算結果

方法:1、去除空格字元、新增空格、分割成list(形如:['1', '-', '2', '+', '1', '*', '5'])。

2、申請兩個棧,分別用於存放數字、運算子。

3、從左到右每次讀取s中的乙個元素:

3.1、如果是數字,則轉化為整形壓入數字棧;

3.2、如果是運算子,則與當前運算子棧頂元素比較,優先順序大於棧頂元素則入棧;

3.3、優先順序小於等於當前棧頂元素,則:

3.3.1、取出兩個數字,與當前棧頂元素進行運算,結果壓入數字棧,

3.3.2、重複此過程,直到清空當前運算子棧;

3.4、然後,將當前運算子壓入運算子棧。

4、對最終的兩個棧,進行提取元素並計算得出最終結果。

"""ops = ['+','-','*','/']

prority =

s = s.replace(' ','')

if s[0] == '-':

s = '0' + s

elif s[0] == '+':

s = s[1:]

for sp in ops:

s = s.replace(sp,' '+sp+' ')

s = s.split(' ')

stack_num, stack_ope = stack(), stack()

for sym in s:

if sym in ops:

if stack_ope.count == 0:

stack_ope.push(sym)

else:

while stack_ope.count>0:

sym_top = stack_ope.pull()

if prority[ops.index(sym_top)] >= prority[ops.index(sym)]:

a = stack_num.pull()

b = stack_num.pull()

temp_result = arith_ont_step(b,a,sym_top)

stack_num.push(temp_result)

else:

stack_ope.push(sym_top)

break

stack_ope.push(sym)

else:

stack_num.push(int(sym))

# 然後對當前兩個棧進行出棧計算

資料結構與演算法 簡單棧實現及其應用

棧 棧的實現 棧的鍊錶實現 棧的陣列實現 以上測操作都是以常數時間執行,非常快速的只有乙個操作,以下我們用陣列實現自己的乙個棧 author liaojiamin date created in 18 07 2020 12 2 public class mystack 擴容 public void ...

資料結構與演算法 棧及利用棧實現簡單括號匹配

棧 一種有次序的資料項集合,在棧中,資料項的加入和移除 都僅發生在同一端,距離棧底越近的資料項,留在棧中的時間 就越長。這種次序通常稱為 後進先出lifo last in first out 利用棧實現簡單括號匹配 遇到左括號則入棧 s.push symbol else 遇到右括號時,棧為空,則說明...

資料結構與演算法(六)

遞迴的應用 1.什麼是遞迴 遞迴是一種方法呼叫自己的程式設計技術。例 public class recusion 例一 public static void test 例二 public static void test2 int n system.out.println n test2 n 1 2...