利用棧實現中綴表示式轉字尾表示式

2021-07-26 09:40:42 字數 2092 閱讀 5172

中綴表示法(或中綴記法)是乙個通用的算術或邏輯公式表示方法, 操作符是以中綴形式處於運算元的中間(例:3 + 4)。與字首表示式(例:+ 3 4)或字尾表示式(例:3 4 +)相比,中綴表示式不容易被電腦解析,但仍被許多程式語言使用,因為它符合人們的普遍用法。

逆波蘭表示法(reverse polish notation,rpn,或逆波蘭記法),是一種是由波蘭數學家揚·武卡謝維奇2023年引入的數學表示式方式,在逆波蘭記法中,所有操作符置於運算元的後面,因此也被稱為字尾表示法。逆波蘭記法不需要括號來標識操作符的優先順序。

將中綴表示式(即標準的表示式)轉換為字尾表示式

例如:1+2*3+(4*5+6)*7 轉換成 123*+45*6+7*+

當讀到乙個運算元時,立即將它放到輸出中。操作符不立即輸出,放入棧中。遇到圓括號也是推入棧中。

如果遇到乙個右括號,那麼就將棧元素彈出,將符號寫出直到遇到乙個對應的左括號。但是這個左括號只被彈出,並不輸出。

在讀到操作符時,如果此時棧頂操作符優先順序大於或等於此操作符,彈出棧頂操作符直到發現優先順序更低的元素位置。除了處理『)』的時候,否則決不從棧中移走『(』。操作符中,『+』和『-』優先順序最低,『*』和『/』優先順序中等,『(』和『)』最高。

如果讀到輸入的末尾,將棧元素彈出直到該棧為空,將符號寫到輸出中。

首先,讀入『1』,並送到輸出,然後『+』被讀入並壓入棧中。接下來『2』讀入並送到輸出,此時狀態如下:

棧:+

輸出:1 2

接下來讀入『*』,由於優先順序比棧頂元素『+』大(原則3),因此被壓入棧中,接著讀入『3』,並送到輸出:

棧:+ *

輸出:1 2 3

然後讀入『+』,由於此時棧頂元素為『*』,優先順序比『+』大,因此將『*』彈出,彈出後原來的『+』變為棧頂元素,由於『+』的優先順序和當前讀入的『+』優先順序相等,因此也被彈出(原則3),最後將讀入的『+』壓入棧中,因此狀態如下:

棧:+

輸出:1 2 3 * +

繼續讀入,此時讀入『*』,除非處理『)』,否則『(』絕不會彈出,因此『*』被壓入棧中,接下來讀入『5』:

棧:+ (*

輸出:1 2 3 * + 4 5

往後讀入的符號是『+』,將『*』彈出並輸出。然後將『+』壓入棧中,接著讀入『6』:

棧:+ ( +

輸出:1 2 3 * + 4 5 * 6

現在讀入『)』,因此彈出棧中元素直到遇到『(』:

棧:+

輸出:1 2 3 * + 4 5 * 6 +

現在輸入為空,彈出所有棧中元素

棧:空

輸出:1 2 3 * + 4 5 * 6 + 7 * +

/*

利用棧將(中綴表示式)轉換成(字尾表示式)

e.g.

1+2*3+(4*5+6)*7 轉換成 123*+45*6+7*+

infix(中綴表示式) : 1+2*3+(4*5+6)*7

postfix(字尾表示式) : 123*+45*6+7*+

*/#include

#include

#include

#include

using

namespace

std;

void infixtopostfix(const

string infix, string& postfix)

marktop = mark.top();}}

mark.push(infix[i]);

break;

case

'(':

if(infix[i - 1] >= '0' && infix[i - 1] <= '9')

mark.push(infix[i]);

break;

case

')':

mark.pop();

}break;

default:

break;}}

// 剩餘的全部出棧

while(!mark.empty())

}int main(int argc, char

const *argv)

利用棧將 (中綴表示式) 轉換成 (字尾表示式)

C 利用棧實現中綴表示式轉字尾表示式

題目 現有中綴表示式如 1 2 3 4 10 5 請用棧的特性編寫乙個程式,使得程式輸出字尾表示式 分析如下 step1 1 2 3 4 10 5 首先遇到第乙個輸入是數字1,數字在字尾表示式中都是直接輸出,接著是符號 入棧 step2 1 2 3 4 10 5 第三個字元是 依然是符號,入棧,接著...

棧 中綴表示式轉字尾表示式

中綴轉字尾的演算法 遍歷中綴表示式中的數字和符號 對於數字 直接輸出 對於符號 左括號 進棧 運算符號 與棧頂符號進行優先比較 若棧頂符號優先順序低 此符號進棧 預設棧頂若是左括號,則左括號的優先順序最低 若棧頂符號優先順序高 將棧頂符號彈出 並輸出 直到棧頂的符號優先順序低,然後進棧 右括號 將棧...

棧 中綴表示式轉字尾表示式 stack實現

題目描述 輸入乙個中綴表示式,程式設計輸出其字尾表示式,要求輸出的字尾表示式的運算次序與輸入的中綴表示式的運算次序相一致。為簡單起見,假設輸入的中綴表示式由 加 減 乘 除 四個運算符號以及左右圓括號和英文本母組成,其中算術運算子遵守先乘除後加減的運算規則。假設輸入的中綴表示式長度不超過300個字元...