將中綴表示式轉換為字尾表示式:
與轉換為字首表示式相似,遵循以下步驟:
(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...