字尾表示式計算

2021-07-04 08:52:38 字數 1407 閱讀 9527

將中綴表示式轉換為字尾表示式:

與轉換為字首表示式相似,遵循以下步驟:

(1) 初始化兩個棧:運算子棧s1和儲存中間結果的棧s2;

(2) 從左至右掃瞄中綴表示式;

(3) 遇到運算元時,將其壓入s2;

(4) 遇到運算子時,比較其與s1棧頂運算子的優先順序:

(4-1) 如果s1為空,或棧頂運算子為左括號「(」,則直接將此運算子入棧;

(4-2) 否則,若優先順序比棧頂運算子的高,也將運算子壓入s1(注意轉換為字首表示式時是優先順序較高或相同,而這裡則不包括相同的情況);

(4-3) 否則,將s1棧頂的運算子彈出並壓入到s2中,再次轉到(4-1)與s1中新的棧頂運算子相比較;

(5) 遇到括號時:

(5-1) 如果是左括號「(」,則直接壓入s1;

(5-2) 如果是右括號「)」,則依次彈出s1棧頂的運算子,並壓入s2,直到遇到左括號為止,此時將這一對括號丟棄;

(6) 重複步驟(2)至(5),直到表示式的最右邊;

(7) 將s1中剩餘的運算子依次彈出並壓入s2;

(8) 依次彈出s2中的元素並輸出,結果的逆序即為中綴表示式對應的字尾表示式**換為字首表示式時不用逆序)。

#include#include#include#include#includeusing namespace std;

//字尾表示式表示式求值

char a[1010];

char b[1010];

stack s1; //儲存運算子的棧

stack s2; //儲存值的棧

int i,j,n,m,t;

float x,y,z;

int fun(char x) //比較優先順序

}float js(float x,float y,char z) //運算

}int main()

d=atof(c); //將字串轉化為浮點型

s2.push(d); //進棧

i--;

}else if(a[i]=='(')

s1.push(a[i]);

else if(a[i]==')') //依次彈出a棧頂的運算子,並壓入b,直到遇到左括號為止,將這一對括號丟棄

s1.pop();

}else

s1.push(a[i]);}}

while(s1.top()!='#') //計算

b[j]='=';

b[j+1]='\0';

puts(b); //輸出字尾表示式

printf("%.2f\n",s2.top()); //輸出值 預設保留兩位小數

s2.pop(); //出棧

}return 0;

}

字尾表示式計算

演算法 1.遍歷字尾表示式中的數字和符號 對於數字 進棧 對於符號 從棧中彈出右運算元 從棧中彈出左運算元 根據符號進行運算 將運算結果壓入棧中 2.遍歷結束 棧中的唯一數字為計算結果 include include linkstack.h int isnumber char c int isope...

字尾表示式計算

字尾表示式這樣一種型別的表示式,運算元在前,操作符在後。例如這樣的一位數字尾表示式 32 5 4 對等的四則表示式為 3 2 5 4。試編寫程式,求解乙個一位數的字尾表示式計算,表示式支援 操作,其中 為整除。輸入 表示式輸出 計算值樣例輸入 32 5 4 樣例輸出 21提示 可使用棧 解題關鍵 1...

計算字尾表示式

一 通過棧把中綴表示式轉換為字尾表示式的步驟 從左至右掃瞄中綴表示式,if 遇到數字 else if 遇到 else if 遇到 else if 遇到運算子op elseelseelse if 遇到操作符op 1 型別標記 enum設定預設值10,20是為了區分 負號 使得相差較大,便於區別 sta...