hyperf/docs/zh-hk/rpn.md

96 lines
2.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# RPN - 逆波蘭表示法
![PHPUnit](https://github.com/hyperf/rpn-incubator/workflows/PHPUnit/badge.svg)
`RPN` 是一種是由波蘭數學家揚·武卡謝維奇 1920 年引入的數學表達式方式,在逆波蘭記法中,所有操作符置於操作數的後面,因此也被稱為後綴表示法。逆波蘭記法不需要括號來標識操作符的優先級。
```
composer require hyperf/rpn
```
## RPN 邏輯
基本邏輯
- while 有輸入
- 讀入下一個符號 X
- IF X 是一個操作數
- 入棧
- ELSE IF X 是一個操作符
- 有一個先驗的表格給出該操作符需要 n 個參數
- IF 堆棧中少於 n 個操作數
- (錯誤)用户沒有輸入足夠的操作數
- Elsen 個操作數出棧
- 計算操作符。
- 將計算所得的值入棧
- IF 棧內只有一個值
- 這個值就是整個計算式的結果
- ELSE 多於一個值
- (錯誤)用户輸入了多餘的操作數
實例
中綴表達式 `5 + ((1 + 2) * 4) - 3` 寫作
`5 1 2 + 4 * + 3 -`
下表給出了該逆波蘭表達式從左至右求值的過程,堆棧欄給出了中間值,用於跟蹤算法。
| 輸入 | 操作 | 堆棧 | 註釋 |
| ---- | -------- | ------- | -------------------------- |
| 5 | 入棧 | 5 | |
| 1 | 入棧 | 5, 1 | |
| 2 | 入棧 | 5, 1, 2 | |
| + | 加法運算 | 5, 3 | 1, 2 出棧,將結果 3 入棧 |
| 4 | 入棧 | 5, 3, 4 | |
| * | 乘法運算 | 5, 12 | 3, 4 出棧,將結果 12 入棧 |
| + | 加法運算 | 17 | 5, 12 出棧,將結果 17 入棧 |
| 3 | 入棧 | 17, 3 | |
| - | 減法運算 | 14 | 17, 3 出棧,將結果 14 入棧 |
計算完成時棧內只有一個操作數這就是表達式的結果14
## 使用
直接計算 RPN 表達式
```php
<?php
use Hyperf\Rpn\Calculator;
$calculator = new Calculator();
$calculator->calculate('5 1 2 + 4 * + 3 -', []); // '14'
```
設置計算精度
```php
<?php
use Hyperf\Rpn\Calculator;
$calculator = new Calculator();
$calculator->calculate('5 1 2 + 4 * + 3 -', [], 2); // '14.00'
```
設置變量
```php
<?php
use Hyperf\Rpn\Calculator;
$calculator = new Calculator();
$calculator->calculate('[0] 1 2 + 4 * + [1] -', [5, 10]); // '7'
```
### 中綴表達式轉化為後綴表達式
> 暫時不支持使用變量
```php
<?php
use Hyperf\Rpn\Calculator;
$calculator = new Calculator();
$calculator->toRPNExpression('4 - 2 * ( 5 + 5 ) - 10'); // 4 2 5 5 + * - 10 -
```