表达式求值--栈
用栈的方式,将中缀转为后缀,再进行求值。另外附加括号匹配的方法
1 public class PostfixExpression { 2 3 public static int lastvalue(String str){ //后缀表达式求值,传入空格分割的字符串 4 Stack<Integer> stack = new Stack<Integer>(); 5 String[] data = str.split(" "); 6 7 for(int i = 0;i < data.length;i++){ 8 if(data[i].charAt(0) >= '0' && data[i].charAt(0) <= '9'){ 9 //将data[i]转换为int数据 10 int m = Integer.parseInt(data[i]); 11 stack.push(m); 12 }else{ 13 int a = stack.pop(); 14 int b = stack.pop(); 15 //构造b ? a计算结果,,将结果入栈 16 switch(data[i].charAt(0)){ 17 case '+':stack.push(b+a);break; 18 case '-':stack.push(b-a);break; 19 case '*':stack.push(b*a);break; 20 case '/':stack.push(b/a);break; 21 case '%':stack.push(b%a);break; 22 } 23 } 24 // System.out.println("---list:"+stack); 25 } 26 return stack.peek(); 27 } 28 public static String turnvalue(String s){ //中缀变换后缀 29 Stack<String> stack = new Stack<String>(); 30 StringBuffer sb = new StringBuffer(); 31 int i = 0; 32 while(i < s.length()){ 33 char c = s.charAt(i); 34 switch(c){ 35 case '+':case '-': 36 while(!stack.isEmpty() && !stack.peek().equals("(")) 37 sb.append(stack.pop()+" "); 38 stack.push(c + "");i++; 39 break; 40 case '*':case '/': 41 while(!stack.isEmpty() && (stack.peek().equals("*") || stack.peek().equals("/"))) 42 sb.append(stack.pop()+" "); 43 stack.push(c + "");i++; 44 break; 45 case '(': 46 stack.push(c + "");i++; 47 break; 48 case ')': 49 while(stack.peek() != null && !stack.peek().equals("(")) 50 sb.append(stack.pop() + " "); 51 stack.pop(); 52 i++;break; 53 default: 54 if(c == ';'){ 55 i++; 56 break; 57 } 58 while(i < s.length() && c >='0' && c <= '9'){ 59 sb.append(c);i++; 60 if(i < s.length()) 61 c = s.charAt(i); 62 } 63 sb.append(" "); 64 } 65 } 66 while(!stack.isEmpty()) 67 sb.append(stack.pop()+" "); 68 // System.out.println(sb); 69 70 return sb.toString(); 71 } 72 public static String match(String str) { //计算括号匹配 73 int x = 0; // 花括号的个数 74 int y = 0; // 方括号的个数 75 int z = 0; // 弧括号的个数 76 int k = 0; // 尖括号的个数 77 boolean isMatch = true; // 是否匹配 78 Stack<Character> stack = new Stack<Character>(); 79 80 if( str.charAt(0) == ')') 81 isMatch = false; 82 for (int i = 0; i < str.length(); i++) { 83 char ch = str.charAt(i); 84 stack.push(ch); 85 if (ch == '}') { 86 x++; 87 while(isMatch){ 88 if (stack.isEmpty()){ 89 isMatch = false; 90 break; 91 } 92 if(stack.pop() == '{') 93 break; 94 } 95 } 96 if (ch == ']') { 97 y++; 98 while(isMatch){ 99 if (stack.isEmpty()){ 100 isMatch = false; 101 break; 102 } 103 if(stack.pop() == '[') 104 break; 105 } 106 } 107 if (ch == ')') { 108 z++; 109 while(isMatch){ 110 if (stack.isEmpty()){ 111 isMatch = false; 112 break; 113 } 114 if(stack.pop() == '(') 115 break; 116 } 117 } 118 if (ch == '>') { 119 k++; 120 while(isMatch){ 121 if (stack.isEmpty()){ 122 isMatch = false; 123 break; 124 } 125 if(stack.pop() == '<') 126 break; 127 } 128 } 129 } 130 // System.out.println("list:"+stack); 131 if(!stack.isEmpty()) 132 isMatch = false; 133 134 StringBuffer sb = new StringBuffer(); 135 if (isMatch) 136 sb.append("配对。共有"+ x +"对{}、"+ y +"对[]、"+ z +"对()、"+ k +"对<>。"); 137 else 138 sb.append("不配对。"); 139 140 return sb.toString(); 141 } 142 }
作 者:月 暮
出 处:https://www.cnblogs.com/AardWolf/
特此声明:欢迎园子的大大们指正错误,共同进步。如有问题或建议,也请各位大佬多多赐教!如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
出 处:https://www.cnblogs.com/AardWolf/
特此声明:欢迎园子的大大们指正错误,共同进步。如有问题或建议,也请各位大佬多多赐教!如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。