中序表示式:對人而言是很直觀的(我們平時計算時接觸最多的表示式),但計算機處理起來比較麻煩(括號、優先順序之類的),前序和後序表示式中沒有括號,而且在計算中只需單向掃瞄,不需要考慮運算子的優先順序。如2+3*4+5。
前序表示式:又稱為字首表示式,不含括號的算術表示式,而且它是將運算子寫在前面,運算元寫在後面的表示式,例如:"+ 2 + * 3 4 5",也稱為「波蘭式」。它運算時需要注意是從右往左結合,也就是運算子的右側的兩個數字進行運算, 因為'+' 比'*'優先順序低, 此時先計算3*4,表示式變為"+ 2 + 12 5", 再將 12 + 5, 表示式變為"+ 2 17",最終得結果19。
後序表示式:與前序表示式掃瞄方式正好相反,例如:"2 3 4 * 5 + + ",它計算時是按從左往右結合,運算子左側的兩個數字進行計算,遇到第乙個』*',計算 3*4,表示式變為"2 12 + 5 +", 在計算2 + 12,表示式變為"14 5 +",最終得到結果19。
本篇主要講中序表示式,下面看用棧實現中序表示式的具體過程:
1.先將表示式轉換為字元,判斷字元是數字還是運算子,數字push到運算數棧, 運算子和括號push到運算子棧。
2.需要考慮運算子的優先順序,'*', '/' 的優先順序大於 '+', '-'先對優先順序高的運算子進行出棧計算。
3.當左括號'('入棧時,繼續第2步操作,直到匹配到右括號')'。
4.運算子棧為空,運算結束,返回運算數棧結果。
說了這麼多,上**:
public class infixexpr
i--; // 回退一位
stackofnum.push(float.parsefloat(sbuf.tostring()));
}else if (tokens[i] == '(')
stackofops.push(tokens[i]);
else if (tokens[i] == ')')
else if (tokens[i] == '+' || tokens[i] == '-' || tokens[i] == '*' || tokens[i] == '/')
} while (!stackofops.empty())
stackofnum.push(caculate(stackofops.pop(), stackofnum.pop(), stackofnum.pop()));
return stackofnum.pop();
}public static boolean hasprecedence(char op1, char op2)
public static float caculate(char op, float b, float a)
return a / b;
} return 0;
}public static void main(string args)
}
最後附上劉欣老師的**: 參考**
中序表示式轉後續表示式的堆疊實現
逐個字元讀取中序表示式,若為字母則直接新增到後續表示式中。若為 則壓入堆疊。若為 則不斷從堆疊中彈出運算子,直到遇到 為止。若為 中的某個運算子時,若運算子優先順序高於棧頂運算子優先順序,則將其直接壓入堆疊,否則不斷出棧運算子,直到滿足該運算子優先順序高於棧頂運算子優先順序或者堆疊為空時,再將該運算...
中序表示式轉字尾表示式
3 4 5 6 這種寫法是中序表示式 而後序表示式則是將運算子放在運算元的後面,如 3 4 5 6 可以看出後序表示式中沒有括號,只表達了計算的順序,而這個順序恰好就是計算器中的一般計算順序。建立乙個棧s 從左到右讀表示式,如果讀到運算元就將它壓入棧s中,如果讀到n元運算子 即需要引數個數為n的運算...
中序表示式轉後序表示式
演算法的思想是這樣的 演算法分為兩個棧,乙個opstack為操作符棧,另一numstack為運算元棧,隨著程式執行運算元棧中里也會有操作符,這是因為小運算元和操作符化作了更大的運算元。如果需要求值,就會將運算元計算出結果,而由於此演算法只是求表示式,所以就保留了操作符。每一次彈出棧時都會涉及到操作符...