資料結構和演算法學習第三節 棧

2021-10-16 12:04:03 字數 2834 閱讀 6567

陣列實現棧思路分析(先不考慮執行緒安全問題)

1、定義乙個top表示棧頂,初始化為-1。

2、入棧的操作,當有資料入棧時, top ++ ,stack[top] = data

3、出棧的操作:臨時變數 value = stack[top];top–;return value;

package com.example.data.sparse.stack;

/** * @author zjt

* 陣列模擬棧

*/public

class

arraystack

// 判斷棧是否已經滿了

public

boolean

isfull()

// 判斷棧是否為空

public

boolean

isempty()

// 入棧

public

void

push

(e e)

top++

; stack[top]

= e;

}// 出棧

public e pop()

object value = stack[top]

; top--

;return

(e) value;

}// 遍歷棧 遍歷時需要從棧頂開始顯示資料

public

void

show()

for(

int i = top; i >=

0; i--)}

}class

client

}

棧也可以使用鍊錶方式實現,使用頭插法、頭刪法使用會簡單一些。

案例一 棧實現表示式計算:比如1+2+3*4-5的值。

思路1、我們需要兩個棧,乙個是數棧,用來存放數字。乙個是符號棧,用來存放運算子。

2、通過index索引,來遍歷我們的表示式。

3、如果發現是數字就直接存放到數棧。

4、如果發現掃瞄到乙個符號,就要分情況討論:

4.1如果當前符號棧為空,就直接入棧。

4.2如果符號棧有操作符,就進行比較,如果當前操作符號的優先順序小於或者等於棧中的操作符號,就需要從數棧中pop出兩個數字,然後從符號棧中pop出乙個符號進行運算,將得到的結果入數棧,然後將當前的操作符入符號棧。如果當前的操作符號的優先順序大於棧中的操作符號,就直接入棧。

5、當表示式掃瞄完畢後,就順序的從數棧和符號棧pop出相應的數和符號並執行。

6、最後在數棧只有乙個數字,就是表示式的結果。

棧中的擴充套件功能

// 檢視當前棧頂的值,但是不出棧,只是偷看一眼

public e peek()

return

(e) stack[top];}

// 擴充套件功能 返回運算子的優先順序

// 這裡定義 數字越大 優先順序越高

public

intpriority

(char opera)

}// 判斷是否是操作符號

public

boolean

isopera

(char c)

// 計算方法

public

intcal

(int num1,

int num2,

char opera)

}// 計算方法

public

intcal1

(int num1,

int num2,

char opera)

}

計算邏輯

// 棧之前已經實現,直接使用 擴充套件一下功能

class

calculator

else

else}}

else

index++;}

while

(index < expression.

length()

);// 當表示式掃瞄完畢後,獲取到兩個棧 棧中的計算與真實計算剛好相反 原因是 **棧的先出棧導致反著計算

// 所以會出現 1-1*1+9 = -9 的情況 這時 數棧中儲存 1 1 9 符號棧中儲存 - + 按照棧的規則計算是 1+9 1-10 的錯誤

// 數棧

// arraystacknumstack1 = new arraystack<>(10);

// // 符號棧

// arraystackoperastack1 = new arraystack<>(10);

// 進行棧的反序列

// for (;;)

// operastack1.push(operastack.pop());

// }

// for (;;)

// numstack1.push(numstack.pop());

// }

while

(true

) num1 = numstack.

pop();

num2 = numstack.

pop();

opera = operastack.

pop();

result = numstack.

cal1

(num1, num2, opera)

; numstack.

push

(result);}

}}

Python學習筆記 第三節

算術運算子 就是我們常用的 兩個物件相加 也可以用來字串的連線 兩個數相減 得到的數可以是負值 兩個數做乘法運算,或者將乙個字串重複幾次 兩個數做除法運算,需要注意 在python2版本裡邊,兩個相除,得到的也是整數,如果想要得到浮點數,只要把其中乙個數變為浮點數就好 例程環境 python 3 冪...

python學習 GUI第三節

1.entry 輸入控制項 用於顯示簡單的文字內容 from tkinter import root tk e entry root e.pack padx 20,pady 20 mainloop 執行結果 然後再高階一點 from tkinter import root tk label root...

資料結構與演算法第三節 陣列的使用

陣列 array 是一種線性表資料結構,它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。陣列的特性 線性表 連續的 相同型別 線性表 就是資料排成像一條線一樣的結構。每個線性表的資料最多只有前和後兩個方向。ps 陣列 鍊錶 佇列都是線性表結構。其結構和簡單特性如下圖所示 ps 除了線性表,還...