- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好的,所以我将 double 值发送给它,它不会将它们解析为 double 值,而是完全忽略十进制值。这是我的代码,如果我输入 2.0 + 5.0,它就会变成 2 0 5 0 +。 =(
import java.beans.Expression;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Infix2Postfix {
private static String grabDigits(String s, int start){
String num = "";
for(int i=start; i < s.length(); i++){
char ch = s.charAt(i);
if(Character.isDigit(ch))
num += ch;
else
return num;
}
return num;
}
private static Double apply(Double a, char op, Double b){
switch(op){
case '+' : return a + b;
case '-' : return a - b;
case '*' : return a * b;
case '/' : return b == 0 ? null : a / b;
default:
return null;
}
}
public static Double evalPostfix(String expr){
Stack<Double> s = new Stack<Double>();
for(int i=0; i<expr.length(); ){
char ch = expr.charAt(i);
if(Character.isDigit(ch)){
String numStr = grabDigits(expr, i);
i += numStr.length();
Double value;
if(isColmn(numStr)){
value = getvaluefromcolmn(numStr);
}else{
value = Double.parseDouble(numStr);
}
s.push(value);
}
else {
if(isOp(ch)){
if(s.size() < 2) return null;
Double b = s.pop(); // right arg
Double a = s.pop(); // left arg
s.push(apply(a, ch, b));
}
else if(!Character.isWhitespace(ch))
return null;
i++; // consume individual char
}
}
if(s.size() != 1) return null;
return s.pop();
}
private static Double getvaluefromcolmn(String numStr) {
// TODO Auto-generated method stub
return null;
}
private static boolean isColmn(String numStr) {
// TODO Auto-generated method stub
return false;
}
private static int prec(char op){
switch(op){
case '+' :
case '-' :
return 0;
case '*' :
case '/' :
return 1;
default:
return -1;
}
}
private static boolean isOp(char ch){
return prec(ch) != -1;
}
public static String infix2postfix(String expr) {
Stack<Character> s = new Stack<Character>();
String pExpr = "";
int numOperands = 0;
int numOperators = 0;
for(int i=0; i<expr.length(); i++){
char ch = expr.charAt(i);
if(Character.isDigit(ch)){
pExpr += " " + ch;
// could have used the grabDigits method here ...
while(i+1 < expr.length() && Character.isDigit(expr.charAt(i+1))){
pExpr += expr.charAt(i+1);
i++;
}
numOperands++;
}
else if (ch == '(')
s.push(ch);
else if (ch == ')'){
while(!s.empty() && s.peek() != '('){
pExpr = pExpr + " " + s.pop() + " ";
numOperators++;
}
if(s.empty())
return "no matching open paren";
if(numOperators >= numOperands)
return "too many operators";
s.pop();
}
else if(isOp(ch)){
// pop operators with same or higher precedence
while(!s.empty() && isOp(s.peek()) && prec(s.peek()) >= prec(ch)){
pExpr = pExpr + " " + s.pop();
numOperators++;
}
if(numOperators >= numOperands)
return "too many operators";
s.push(ch);
}
// else white space - do nothing
}
while(!s.empty()){
char op = s.pop();
if(!isOp(op))
return "error";
pExpr += " " + op;
}
return pExpr;
}
public static void exp(String expr, ArrayList<ArrayList<Comparable<?>>> entries){
expr.replace("(", " ( ");
expr.replace(")", " ) ");
expr.replace("+", " + ");
expr.replace(" - ", " - ");
expr.replace("/", " / ");
expr.replace("*", " * ");
System.out.println("infix: " + expr);
System.out.println("this is at expreesion after replacing "+ expr);
System.out.println("postfix: " + infix2postfix(expr));
System.out.println("--------");
}
public static void main(String [] args){
Scanner kbd = new Scanner(System.in);
// ArrayList<int> tst;
ArrayList<Integer> tst2;
System.out.print("> ");
while(kbd.hasNextLine()){
String expr = kbd.nextLine();
expr = expr.replaceAll("\\s+","");
System.out.println(expr);
Pattern pattern = Pattern.compile("\\s+");
Matcher matcher = pattern.matcher(expr);
boolean check = matcher.find();
String str = matcher.replaceAll(" ");
expr = expr.replace("(", " ( ");
expr =expr.replace(")", " ) ");
expr =expr.replace("+", " + ");
expr =expr.replace("-", " - ");
expr =expr.replace("/", " / ");
expr =expr.replace("*", " * ");
String[] exprArray = expr.split(" ");
System.out.println(str+ " this is expr "+exprArray[1]);
System.out.println(expr);
ArrayList<ArrayList<Comparable<?>>> entries = null;
String pExpr = infix2postfix(expr);
//System.out.println(evalPostfix(expr));
System.out.println(" postfix version: " + pExpr);
System.out.println(" eval(\"" + pExpr + "\"): " + evalPostfix(pExpr));
System.out.print("> ");
}
}
最佳答案
我没有详细检查你的代码,但是下面一行
while(i+1 < expr.length() && Character.isDigit(expr.charAt(i+1))) ...
看起来您只为每个表达式解析数字而不是 '.'
。
这同样适用于您的方法 grabDigits
。
关于java - 不评价 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7537890/
Confusion rose because of this post. The author updated his post, and the result became clear. Concl
假设我有以下语句: bool foo=true; if (foo){ foo=false; } else{ //do
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
我有一个表单,其中有很多设置页面。所有的页面都是一样的,所以我宁愿只制作一个表格,然后传入它应该编辑的设置的名称。我该怎么做?假设该表单称为“ConfigForm”,我希望能够用这样的方式调用它: n
简单问题: 我通过 javascript 使用 Youtube gdata 来:评论、回复和喜欢/不喜欢视频。到目前为止一切正常! 但是,我正在尝试允许用户特别喜欢和不喜欢评论(就像在本地 youtu
我在设置 TableView 中有一个单元格,我想将用户直接发送到 Appstore 并打开应用程序页面,以便他们可以发表评论。在 Stackoverflow 中有很多关于此的内容,但在 iOS8 和
快速提问 - 如标题所述。那可能吗?我认为以下端点是我最好的选择:https://developers.google.com/youtube/v3/docs/comments/update ,但找不到
我是一名优秀的程序员,十分优秀!