[위 에]자바 표현 식 값 구하 기

자바 표현 식 구 해 실현,스 택 선진 후 나 오 는 특징 사용,상세 한 코드 참조
public float evaluation(String textField) {
		StringBuilder str = new StringBuilder();
		Stack<Float> stk = new Stack<Float>(); //           
		Stack<Character> stk2 = new Stack<Character>(); //        
		stk2.push('#'); //          '#',             
		char c;
		//       
		for (int i = 0; i < textField.length(); i++) {
			boolean isbeg = false;//            
			c = textField.charAt(i);
			if ((c >= '0' && c <= '9') || c == '.') { //           
				str.append(c);
			} else if (c == '+' || c == '-' || c == '*' || c == '/' || c == '('
					|| c == ')') {
				if ((c == '+' || c == '-') && stk.empty() && str.length() == 0) {
					str.append(c);
					isbeg = true;
				} else if (str.length() != 0) {
					try {
						float f = Float.parseFloat(str.toString());
						stk.push(f);
					} catch (Exception e) {
						flag = false;
						return -1;
					}
					str.delete(0, str.length());
				}
				//                       ,    ,           
				if (judge(stk2.peek()) >= judge(c) && !isbeg) {
					try {
						float b = Float.parseFloat(stk.pop().toString());
						float a = Float.parseFloat(stk.pop().toString());//         
						char c1 = stk2.pop();//      
						if (c != ')') {
							stk2.push(c); //          
						}
						switch (c1) {
						case '+':
							stk.push(a + b);
							break;
						case '-':
							stk.push(a - b);
							break;
						case '*':
							stk.push(a * b);
							break;
						case '/':
							stk.push(a / b);
							break;

						default:
							break;
						}
					} catch (Exception e) {
						flag = false;
						return -1;
					}

					if (c == ')') {
						while (stk2.peek() != '#') {
							float b = Float.parseFloat(stk.pop().toString());
							try {
								float a = Float
										.parseFloat(stk.pop().toString());//         
								char c1 = stk2.pop();//      
								switch (c1) {
								case '+':
									stk.push(a + b);
									break;
								case '-':
									stk.push(a - b);
									break;
								case '*':
									stk.push(a * b);
									break;
								case '/':
									// if (b == 0) {
									//     
									// } else {
									stk.push(a / b);

									// }
									break;
								default:
									break;
								}
							} catch (Exception e) {
								flag = false;
								return -1;
							}
						}
						// stk2.pop();//   ')'
						stk2.pop();//   '#'
						stk2.pop();//   '('
					}
				} else if (!isbeg) {
					stk2.push(c);
					if (c == '(') {
						stk2.push('#');
					}
				}
			} else {
				flag = false;
				return -1;
			}
		}
		//          ,         
		if (str.length() > 0) {
			try {
				float f = Float.parseFloat(str.toString());
				stk.push(f);
			} catch (Exception e) {
				flag = false;
				return -1;
			}
			str.delete(0, str.length());
		}
		//      "("
		if(stk2.peek()=='#'){
			flag=false;
			return -1;
		}
		while (stk2.peek() != '#') {
			try {
				float b = Float.parseFloat(stk.pop().toString());
				float a = Float.parseFloat(stk.pop().toString());//         
				char c1 = stk2.pop();//      
				switch (c1) {
				case '+':
					stk.push(a + b);
					break;
				case '-':
					stk.push(a - b);
					break;
				case '*':
					stk.push(a * b);
					break;
				case '/':
					// if (b == 0) {
					//     
					// } else {
					stk.push(a / b);

					// }
					break;
				default:
					break;
				}
			} catch (Exception e) {
				flag = false;
				return -1;
			}
		}
		try {
			return Float.parseFloat(stk.pop().toString());
		} catch (Exception e) {
			flag = false;
			return -1;
		}
	}



연산 자 우선 순위 판단
//      
	public static int judge(char c) {
		int n = 0;
		switch (c) {
		case '(':
			n = 3;
			break;
		case '+':
		case '-':
			n = 1;
			break;
		case '*':
		case '/':
			n = 2;
			break;
		case ')':
			n = 0;
			break;
		default:
		}
		return n;
	}

좋은 웹페이지 즐겨찾기