乙個算術表示式,含有數字(為簡化處理,數字只有一位),運算子:+、-、*,以及括號,求表示式的值。
給出的表示式是一般我們見到的中綴表示式,即運算子位於運算元之間。如果把中綴表示式轉化為字尾表示式,那麼對字尾表示式求值將會很方便。
字尾表示式特點:
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...