- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经实现了我在 this link 上找到的算法来评估 j2me 的算术表达式。但只有当我有一位数操作数时它才能正常工作,即 2、5、7、3 但不是 456、56、34.45 等。我做了一些更改,因为我知道我必须添加不是一个一个地找到的数字,但直到我们以数字结尾。然后我也找到了 this link,但事情仍然没有像预期的那样顺利。首先,我尝试了 exp4j 库,但我猜它在 j2me 上不起作用。代码现在变得非常困惑。我可以就如何解决这个问题发表任何意见吗?如有任何帮助,我们将不胜感激。
最初仅适用于个位数操作数的代码:
import java.util.Stack;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
public class SampleInfixToPostfixToResult {
static Stack stack=new Stack();
static StringBuffer p=new StringBuffer();
static Vector v=new Vector();
public static StringBuffer toPostfix(String q)
{
for(int i=0;i<q.length();i++)
{
if(q.charAt(i)=='0'||q.charAt(i)=='1'||q.charAt(i)=='2'||q.charAt(i)=='3'||q.charAt(i)=='4'||q.charAt(i)=='5'||q.charAt(i)=='6'||q.charAt(i)=='7'||q.charAt(i)=='8'||q.charAt(i)=='9')
{
p.append(q.charAt(i));
}
else if(q.charAt(i)=='(')
{
stack.push(q.charAt(i));
}
else if(q.charAt(i)==')')
{
for(int j=0;!stack.empty()&&!stack.peek().equals('(');j++)
{
p.append(stack.pop());
}
stack.pop();
}
else if(q.charAt(i)=='+'||q.charAt(i)=='-'||q.charAt(i)=='/'||q.charAt(i)=='*')
{
if(stack.empty()||stack.peek().equals('('))
stack.push(q.charAt(i));
else
{
while(!stack.empty()&&!stack.peek().equals('(')&&isHigh(q.charAt(i), stack.peek()))
{
p.append(stack.pop());
}
stack.push(q.charAt(i));
}
}
}
while(!stack.empty())
{
p.append(stack.pop());
}
System.out.println(p);
return p;
}
public static boolean isHigh(char op, Object AtStack)
{
char opAtStack=AtStack.toString().charAt(0);
boolean isHigh=false;
if((op==opAtStack))
isHigh=true;
if((op=='+'||op=='-')&&(opAtStack=='/'||opAtStack=='*'))
{
isHigh=true;
}
if((op=='+'&&opAtStack=='-')||(op=='-'&&opAtStack=='+')||(op=='/'&&opAtStack=='*')||(op=='*'&&opAtStack=='/'))
{
isHigh=true;
}
return isHigh;
}
public static double result(StringBuffer p)
{
for(int i=0;i<p.length();i++)
{
System.out.println(p.charAt(i));
if(p.charAt(i)=='0'||p.charAt(i)=='1'||p.charAt(i)=='2'||p.charAt(i)=='3'||p.charAt(i)=='4'||p.charAt(i)=='5'||p.charAt(i)=='6'||p.charAt(i)=='7'||p.charAt(i)=='8'||p.charAt(i)=='9')
{
stack.push(p.charAt(i));
}
if(p.charAt(i)=='+'||p.charAt(i)=='-'||p.charAt(i)=='/'||p.charAt(i)=='*')
{
double a=Double.parseDouble(stack.pop().toString());
double b=Double.parseDouble(stack.pop().toString());
if(p.charAt(i)=='+')
{
stack.push(b+a);
}
else if(p.charAt(i)=='-')
{
stack.push(b-a);
}
else if(p.charAt(i)=='/')
{
stack.push(b/a);
}
else if(p.charAt(i)=='*')
{
stack.push(b*a);
}
}
}
System.out.println(stack);
return 0;
}
public static void main(String[] args) {
// TODO code application logic here
String s=new String("65*(76+2)-0/4+(2*5-6*(2*5))");
SampleInfixToPostfixToResult.result(SampleInfixToPostfixToResult.toPostfix(s));
System.out.println(66*(76+2)-0/4+(2*5-6*(2*5)));
}
}
我为评估多位操作数而工作的更新代码(真的搞砸了)
import java.util.Stack;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
public class SampleInfixToPostfixToResult {
static Stack stack=new Stack();
static StringBuffer p=new StringBuffer();
static Vector v=new Vector();
public static Vector toPostfix(String q)
{
for(int i=0;i<q.length();i++)
{
if(q.charAt(i)=='0'||q.charAt(i)=='1'||q.charAt(i)=='2'||q.charAt(i)=='3'||q.charAt(i)=='4'||q.charAt(i)=='5'||q.charAt(i)=='6'||q.charAt(i)=='7'||q.charAt(i)=='8'||q.charAt(i)=='9')
{
StringBuffer tn=new StringBuffer();
while(i<q.length()&&(q.charAt(i)=='0'||q.charAt(i)=='1'||q.charAt(i)=='2'||q.charAt(i)=='3'||q.charAt(i)=='4'||q.charAt(i)=='5'||q.charAt(i)=='6'||q.charAt(i)=='7'||q.charAt(i)=='8'||q.charAt(i)=='9'))
{
tn.append(q.charAt(i++));
}
v.add(tn);
}
else if(q.charAt(i)=='(')
{
stack.push(q.charAt(i));
}
else if(q.charAt(i)==')')
{
for(int j=0;!stack.empty()&&!stack.peek().equals('(');j++)
{
v.add(stack.pop());
}
stack.pop();
}
else if(q.charAt(i)=='+'||q.charAt(i)=='-'||q.charAt(i)=='/'||q.charAt(i)=='*')
{
if(stack.empty()||stack.peek().equals('('))
stack.push(q.charAt(i));
else
{
while(!stack.empty()&&!stack.peek().equals('(')&&isHigh(q.charAt(i), stack.peek()))
{
v.add(stack.pop());
}
stack.push(q.charAt(i));
}
}
}
while(!stack.empty())
{
v.add(stack.pop());
}
return v;
}
public static boolean isHigh(char op, Object AtStack)
{
char opAtStack=AtStack.toString().charAt(0);
boolean isHigh=false;
if((op==opAtStack))
isHigh=true;
if((op=='+'||op=='-')&&(opAtStack=='/'||opAtStack=='*'))
{
isHigh=true;
}
if((op=='+'&&opAtStack=='-')||(op=='-'&&opAtStack=='+')||(op=='/'&&opAtStack=='*')||(op=='*'&&opAtStack=='/'))
{
isHigh=true;
}
return isHigh;
}
public static double result(Vector p)
{
for(int i=0;i<p.size();i++)
{
System.out.println(p.get(i));
if(p.get(i)=="0"||p.get(i)=="1"||p.get(i)=="2"||p.get(i)=="3"||p.get(i)=="4"||p.get(i)=="5"||p.get(i)=="6"||p.get(i)=="7"||p.get(i)=="8"||p.get(i)=="9")
{
StringBuffer tn=new StringBuffer();
while(i<p.size()&&(p.get(i)=="0"||p.get(i)=="1"||p.get(i)=="2"||p.get(i)=="3"||p.get(i)=="4"||p.get(i)=="5"||p.get(i)=="6"||p.get(i)=="7"||p.get(i)=="8"||p.get(i)=="9"))
{
tn.append(p.get(i++));
}
System.out.println("This is the full number :"+tn);
stack.push(tn);
}
if(p.get(i)=="+"||p.get(i)=="-"||p.get(i)=="/"||p.get(i)=="*")
{
double a=Double.parseDouble(stack.pop().toString());
double b=Double.parseDouble(stack.pop().toString());
if(p.get(i)=="+")
{
stack.push(b+a);
}
else if(p.get(i)=="-")
{
stack.push(b-a);
}
else if(p.get(i)=="/")
{
stack.push(b/a);
}
else if(p.get(i)=="*")
{
stack.push(b*a);
}
}
}
System.out.println("Final value: "+stack);
return 0;
}
public static void main(String[] args) {
// TODO code application logic here
String s=new String("65*(79+22)-0/4+(29*5-6*(2*5))");
SampleInfixToPostfixToResult.result(SampleInfixToPostfixToResult.toPostfix(s));
//System.out.println(65*(79+22)-0/4+(29*5-6*(2*5)));
}
}
最佳答案
解决方法:
1.Function toPostfix() 现在返回栈而不是 vector ,因为现在后缀表达式被添加到栈中,例如 [34,57.+] 等。
2.通过遍历字符串直到我们有一个数字来编辑将所有数字存储到堆栈的代码。(请参见第 29 行之前的代码)
import java.util.Stack;
import java.util.Vector;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author Sandeep
*/
public class Main {
static Stack stack=new Stack();
static Stack stackT=new Stack();
//static Vector v=new Vector();
//static StringBuffer p=new StringBuffer();
public static Stack toPostfix(String q)
{
for(int i=0;i<q.length();i++)
{
if(q.charAt(i)=='0'||q.charAt(i)=='1'||q.charAt(i)=='2'||q.charAt(i)=='3'||q.charAt(i)=='4'||q.charAt(i)=='5'||q.charAt(i)=='6'||q.charAt(i)=='7'||q.charAt(i)=='8'||q.charAt(i)=='9')
{
StringBuffer p=new StringBuffer();
while(q.charAt(i)=='0'||q.charAt(i)=='1'||q.charAt(i)=='2'||q.charAt(i)=='3'||q.charAt(i)=='4'||q.charAt(i)=='5'||q.charAt(i)=='6'||q.charAt(i)=='7'||q.charAt(i)=='8'||q.charAt(i)=='9')
p.append(q.charAt(i++));
stackT.push(p);
i--;
}
else if(q.charAt(i)=='(')
{
stack.push(q.charAt(i));
}
else if(q.charAt(i)==')')
{
for(int j=0;!stack.empty()&&!stack.peek().equals('(');j++)
{
stackT.push(stack.pop().toString());
}
stack.pop();
}
else if(q.charAt(i)=='+'||q.charAt(i)=='-'||q.charAt(i)=='/'||q.charAt(i)=='*')
{
if(stack.empty()||stack.peek().equals('('))
stack.push(q.charAt(i));
else
{
while(!stack.empty()&&!stack.peek().equals('(')&&isHigh(q.charAt(i), stack.peek()))
{
stackT.push(stack.pop().toString());
}
stack.push(q.charAt(i));
}
}
}
while(!stack.empty())
{
stackT.push(stack.pop().toString());
}
System.out.println(stackT);
return stackT;
}
//problem lies here
public static boolean isHigh(char op, Object AtStack)
{
char opAtStack=AtStack.toString().charAt(0);
boolean isHigh=false;
if((op==opAtStack))
isHigh=true;
if((op=='+'||op=='-')&&(opAtStack=='/'||opAtStack=='*'))
{
isHigh=true;
}
if((op=='+'&&opAtStack=='-')||(op=='-'&&opAtStack=='+')||(op=='/'&&opAtStack=='*')||(op=='*'&&opAtStack=='/'))
{
isHigh=true;
}
return isHigh;
}
public static double result(Stack p)
{
for(int i=0;i<p.size();i++)
{
if(p.get(i).toString().startsWith("0")||p.get(i).toString().startsWith("1")||p.get(i).toString().startsWith("2")||p.get(i).toString().startsWith("3")||p.get(i).toString().startsWith("4")||p.get(i).toString().startsWith("5")||p.get(i).toString().startsWith("6")||p.get(i).toString().startsWith("7")||p.get(i).toString().startsWith("8")||p.get(i).toString().startsWith("9"))
{
stack.push(p.get(i));
}
if(p.get(i).toString().equals("+")||p.get(i).toString().equals("-")||p.get(i).toString().equals("/")||p.get(i).toString().equals("*"))
{
double a=Double.parseDouble(stack.pop().toString());
double b=Double.parseDouble(stack.pop().toString());
if(p.get(i).equals("+"))
{
stack.push(b+a);
}
else if(p.get(i).equals("-"))
{
stack.push(b-a);
}
else if(p.get(i).equals("/"))
{
stack.push(b/a);
}
else if(p.get(i).equals("*"))
{
stack.push(b*a);
}
}
}
System.out.println(stack);
return 0;
}
public static void main(String[] args) {
// TODO code application logic here
String s=new String("159*(79+23)-10/4+(22*54-67*(25*58))");
Main.result(Main.toPostfix(s));
System.out.println(159*(79+23)-10/4+(22*54-67*(25*58)));
}
}
关于java - j2me : Works only for single digit operands 中的算术表达式求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18267030/
我讨厌发布“这应该很容易,我错过了什么”问题,但是......这应该很容易,我错过了什么?我在这个测试代码上没有得到匹配,我不明白为什么。模式是(或应该是)“任何三个数字,后跟任何三个相同的数字,后跟
我在 digital ocean 上部署了一个应用程序,我想更新它的部署源 (github)。我将我的 github 存储库移到了一个组织,现在 digital ocean 似乎无法再访问它了。 我相
我在 digital ocean 上部署了一个应用程序,我想更新它的部署源 (github)。我将我的 github 存储库移到了一个组织,现在 digital ocean 似乎无法再访问它了。 我相
[抱歉,如果这不太适合 SO,Digits 的支持链接到 SO] 在我的 iOS 应用程序中,有些用户使用 Digits 登录,有些则不使用。我仍然希望能够通过 Digits 的联系人匹配使用他们的通
我有这样的查询: SELECT * FROMmesWHERE text REGEXP '#11' 我想获得#11 的所有含义,例如: #11 #11a 但不是数字后面有数字的情况: #112 所以我厌
我有一个 file.txt 看起来像这样: abe abbe cde 45a678 ae cababb 12345 在运行命令 egrep [[:digit:]] file.txt 之后它显示了两个结
我有一个生产服务器 - 一个 Digital Ocean Droplet - 上面运行着一个数据库和网站。我现在想继续制作一个临时服务器。我认为克隆它是一个好主意,但是执行此类操作的好方法是什么? 到
似乎 get.k8s.io 是部署 Kubernetes 集群的推荐方法,但该脚本不支持 Digital Ocean。 有没有一种我错过的替代方法可以在 Digital Ocean 上轻松设置集群?
我有关于 java 正则表达式的查询。实际上,我是正则表达式的新手。所以我需要帮助来为下面的语句形成一个正则表达式: Statement: a-alphanumeri
我对大家有一些特殊的要求。我需要对以下对象数组进行自定义顺序/排序。我需要订购的数组可能类似于以下示例: //array $scope.myArray = [ { orderI
我有一个数字 N。继续对数字求和,直到得到一位数字的结果。例如 35252 ==> 17 ==> 8我写了以下代码: int digitSum(int n) { int sum = 0;
我想允许用户输入以下十进制或整数值 (A) .5 0.500 3 0 0.0 30 500000 4000.22 0. 这是我使用的以下正则表达式: factor: /^-?\d*[.]??\d*$/
我正在使用if语句显示隐藏的div。用户只需按一下按钮即可循环选择他们想要预订的小时数。时间最多可达 10 小时。 if如果 checkHours 则语句会显示通知小于 5。一切都工作得很好,直到用户
如何编写正则表达式来验证此模式? 123456 - correct *1 - correct 1* - correct 124** - correct *1*2 - correct * - corre
所以这就是我想要做的。 在 git 中推送到 master 有 gitlab-ci 听说推送启动管道 管道构建代码并将 docker 容器推送到 gitlab 注册表 管道通过 ssh 登录到 d
myString.match("[\d]*") 对于 12345 和 77777 给出 true 但我正在寻找的结果是 12345 为 false,7777 为 true 最佳答案 (\d)\1*\D
在 iOS 应用程序中安装 Digits 1.15.1 时,AppDelegate.m 文件中出现以下错误: 无法在导入语句中构建模块“DigitsKit”#import 在 [Fabric wit
如何使正则表达式不匹配超过 2 位数的特定数字。例如除 13 以外的任何数字。下面的第二行代码将无法匹配 10、11...,第三行将查找不以 1 开头但具有 3 的数字: str = 'val=13'
我实际上有一个可能看起来很疯狂的问题,但在 WCF 中我有一个简单的契约(Contract),有时当我将 DataContract 设置为小数时,服务会在“.”之后发回 4 位数字。我其实很期待只有2
如果我执行以下操作: et_user_input.setKeyListener(DigitsKeyListener.getInstance("123-+")); et_user_input.setIn
我是一名优秀的程序员,十分优秀!