表示式求值與字尾表示式

2021-06-16 10:07:22 字數 2156 閱讀 1184

乙個算術表示式,含有數字(為簡化處理,數字只有一位),運算子:+、-、*,以及括號,求表示式的值。

給出的表示式是一般我們見到的中綴表示式,即運算子位於運算元之間。如果把中綴表示式轉化為字尾表示式,那麼對字尾表示式求值將會很方便。

字尾表示式特點:

1.操作符位於運算元之後;

2.沒有括號;

3.運算子沒有優先順序。

中綴表示式轉化為字尾表示式的步驟:

1.初始化乙個空操作符棧和空結果字串;

2.從前到後讀取中綴表示式的字元,如果是運算元,加到結果字串後面;

3.如果是操作符,分兩種情況入棧:

a.如果待入棧操作符優先順序大於棧頂操作符,直接入棧;

b.如果待入棧操作符優先順序小於或等於棧頂操作符,棧頂操作符加到結果字串後面;重複b過程直到遇到前括號『(』或棧頂操作符優先順序比待入棧操作符小,待入棧操作符入棧。

4.如果是前括號『(』,直接入棧;

5.如果是後括號,將棧中操作符依次彈出,直至遇到乙個前括號『(』結束。前括號出棧。

最後結果字串就是字尾表示式。

字尾表示式求值的步驟:

1.初始化乙個空運算元棧;

2.從前到後讀取字尾表示式字元。如果是運算元直接入棧。如果讀到乙個操作符@,彈出棧頂元素a和新的棧頂元素b,執行b @ a,將結果壓入棧中;

3.最後棧中只剩下乙個元素,即表示式的值。

關於中綴表示式轉換成字尾表示式與字尾表示式正確性的說明:

先觀察一些例子:

1.假設中綴表示式沒有括號,且所有運算子優先順序相同。比如a+b-c+d-e+f ,將被轉化為ab+c-d+e-f+。此時用括號來說明字尾表示式執行順序:((((( ab+ ) c- ) d+ ) d- ) f+ ),運算順序沒有改變。

2.假設中綴表示式沒有括號,但是運算子優先順序不同。比如a+b*c+d-e*f,將被轉化為 abc*+d+ef*-,用括號來說明字尾表示式執行順序:((( a ( bc* ) + ) d+ ) ( ef* ) - ),運算順序依然沒有變。

3.假設中綴表示式有括號。比如(a+b)*(c+d)*e+f,將被轉化為ab+cd+*e*f+,用括號表示執行順序(((( ab+ ) ( cd+ ) * ) e* ) f+ )。運算順序還是沒有改變。

不難觀察出以下5點:

1.字尾表示式中運算元出現的順序和中綴表示式一樣。這是因為運算元是直接加入結果字串;

2.每個操作符都會入棧一次,出棧一次;

3.在沒有括號時,如果相鄰兩個操作符優先順序相同或前乙個操作符的優先順序高,則字尾表示式中操作符出現的順序和中綴表示式一樣。因為後乙個操作符入棧時,棧頂元素一定是前乙個相鄰的操作符,如果其優先順序小於等於待入棧的,則前乙個操作符被彈出並加入結果字串,字尾表示式中操作符順序得到保持。

4.在沒有括號時,如果相鄰兩個操作符,後者優先順序大與前者,後者將直接被壓入棧中,且位於前者之上。在出棧時,後者將先出棧,因而字尾表示式中,操作符順序發生交換,即中綴表示式中要先運算的操作在字尾表示式中出現在前面。

5.出現括號。括號中的處理因為遵循前4點,不再贅述,而括號的內容作為乙個整體的性質得到維護。

參考文章:

//資料結構與演算法

//利用字尾表示式對算數表示式求值

//不含符號變數處理,且數字都是一位,運算子僅含+、-、*和括號

#include

#include

#include

#define num 200

using namespace std;

char s[num],a[num],stack[num];

int stacknum[num];

int trans(char s[num],char a[num],char stack[num],int lens)

else if(s[i]=='+' || s[i]=='-')

else if(s[i] == '*')

else if(s[i]=='(')

stack[top++] = s[i];

else if(s[i]==')')

}while(top>0)

return lena; }

int calcu(char a[num],int stack[num],int lena)

return stack[0];}

int main()

字尾表示式實現表示式求值

看到別人寫的乙個表示式求值程式,想到很久之前寫的乙個。中間有個字串轉數值型,可以用stringstream來實現或者c語言裡面的strtod直接得到 include include include include includeusing namespace std class data doubl...

字尾表示式求值

字尾表示式求值過程中不需要考慮運算子的優先順序,只需要對該表示式中的每乙個元素進行判斷,若為運算元則將其儲存在乙個陣列裡 入棧 若為運算子則取出前面的兩個運算元 彈棧 並運算,並將運算結果放回該陣列 入棧 最終陣列的最後乙個元素 棧頂元素 即為該表示式的運算結果.如 字尾表示式 23 等價於中綴表示...

字尾表示式求值

題目描述 為了便於處理表示式,常常將普通表示式 稱為中綴表示 轉換為字尾sqstack 順序棧的初始化 status initstack sqstack s 順序棧的入棧 status push sqstack s,selemtype e 演算法3.3 順序棧的出棧 status pop sqsta...