zoukankan      html  css  js  c++  java
  • [置顶] Java表达式求值

    Java表达式求解实现,用到栈先进后出的特点,详见代码

    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;
    	}


     

  • 相关阅读:
    第6 章 : 应用编排与管理:Deployment
    第5 章 : 应用编排与管理:核心原理
    第4 章 : 理解 Pod 和容器设计模式
    第3 章 : Kubernetes 核心概念
    第2 章 : 容器基本概念
    第1 章 : 第一堂“云原生”课
    阿里云原生技术公开课程-讲师记录及视频链接
    Shell中的(),{}几种语法用法-单独总结
    折腾kubernetes各种问题汇总-<1>
    Kubernetes中Deployment部署故障排除
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3019618.html
Copyright © 2011-2022 走看看