Việc tính giá trị của một biểu thức toán học ở dạng trung tố trong máy tính thông thường sẽ được chuyển sang dạng ký pháp nghịch đảo Ba Lan (hậu tố) để việc tính toán được dễ dàng. Bạn có thể xem lại thuật toán chuyển đổi từ trung tố sang hậu tố trong bài viết  của tôi. Trong bài viết này, tôi sẽ trình bày phương pháp tính giá trị của một biểu thức tiền tố và hậu tố bằng Stack.

Lặp qua các token của của biểu thức postfix từ trái qua phải:
– Nếu là toán hạng: push vào stack
– Nếu là toán tử: pop hai toán hạng trong stack ra và tính giá trị của chúng dựa vào toán tử này. Push kết quả đó lại vào stack.
Phần tử còn sót lại trong stack sau vòng lặp chính là kết quả của biểu thức.

Với elementMath là mảng các phần tử của biểu thức hậu tố.

public String valueMath(String[] elementMath){
		Stack <String> S = new Stack<String>();
		InfixToPostfix  IFP = new InfixToPostfix();
		for (int i=0; i<elementMath.length; i++){
			char c = elementMath[i].charAt(0);
			if (!IFP.isOperator(c)) S.push(elementMath[i]);
			else{
				double num = 0f;
				double num1 = Float.parseFloat(S.pop());
				double num2 = Float.parseFloat(S.pop());
				switch (c) {
					case '+' : num = num2 + num1; break;
					case '-' : num = num2 - num1; break;
					case '*' : num = num2 * num1; break;
					case '/' : num = num2 / num1; break;
					default:
						break;
				}
				S.push(Double.toString(num));
			}
		}
		 return S.pop();
	}
Advertisements