java解析字符串 算术表达式求值

请教CSDN各大神 String字符串"|A-B|+|C-D|" 是一个绝对值运算的表达式,我通过替换 A=10,B=13,C=23,D=20得到 “|10-13|+|23-20|”字符串
我怎么在java中解析?获取结果 6?Java中ScriptEngine  支持加减乘除,但不支持|绝对值表达式
不要说通过字符串分割,如果遇到 "|A-|B-C|+A|> 11"这种通过上面替换希望返回的结果为 false,这又该怎么解析?

5个回答

以正则的方式切割字符串例: /|\d+[+-*//]+/d|/(正则不一定对差不多是这样的)

可以得到数组·["|10-13|","+","|23-20|"]

错误检测可以检查是否有|\/d+| 或者||d+|
当然还会有别的问题需要一一解决

lovingjiajia
kikisang 对于嵌套绝对值运算的就不适用了
2 年多之前 回复

我建议你把| |改为(),读取字符串中的字符,再用两个栈来实现算术表达式的求值,只是每一步求的是绝对值,

lovingjiajia
kikisang 因为表达式可能有复杂的,比如 遇到这样的字符串表达式 |A-(|B-C|+|C-D|)+E|>F,括号也被运用了
2 年多之前 回复
coolsunxu
coolsunxu 他要的意思是绝对值,不包括(),要是包括的话,可以换做其他成对的标志,您是否能解释清楚一下呢
2 年多之前 回复
coolsunxu
coolsunxu 没听明白大神的意思,
2 年多之前 回复
lovingjiajia
kikisang 这个肯定不行,因为括号本身就是运算符
2 年多之前 回复
lovingjiajia
kikisang 好的,谢谢,我去看下这个算法
2 年多之前 回复

求绝对值无非就是把负数变成正数,正数不变;既然这样的话为什么不先求A-B,再求C-D,判断两个结果如果有符号就把符号去掉,然后再相加;

lovingjiajia
kikisang 这是人的想法,你得让机器代码去干这件事。
2 年多之前 回复

可以使用递归来解析绝对值,|D进入递归,D|返回递归数据

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
字符串算术表达式求值
  算术表达式求值,控制台输入一个需要计算的算术表达式:由左右括号、运算符、算术表达式组成的表达式 运算优先级有括号()确定。运算符支持+、-、*和接收一个参数的算术平方根。 /** * 算术表达式求值 该类是一个能够解释给定字符串所表达的运算并计算得到结果的程序 * * 控制台输入一个需要计算的算术表达式:由左右括号、运算符、算术表达式组成的表达式 运算优先级有括号()确定。运算符支持...
算术表达式字符串求值
问题: 计算字符串“10+12*13-30/20”的值 思路: 第一步:从左到右解析字符串,将数值与运算符放入数组 第二步:先计算乘法,将求值放入队列 第三步:依次出队列,计算最终值 python代码实现如下: #!/usr/bin/python # -*- coding: utf-8 -*- import sys cal_string = '10+12*13-30/20' #分隔字符
java算术表达式求值
带反编译器,各种java算术表达式求值.包括开源的和网友开发的
java 算术表达式求值器
java 算术表达式求值器 java 算术表达式求值器
算术表达式求值
这个算术表达式求值的功能特别强大,里面提供了完成代码和整个文件
算术表达式的求值
高手们给我看看这段程序有没有问题呀??rn 错在那里了rn 一有结果就结贴!!rn#include rn #include rn #include rn #include rn struct stackrn int a[10];rn int top;rn rn main()rn void push();rn char gettop();rn void pop();rn int in();rn char precede();rn char opre();rn struct stack *optr,*opnd;rn char c,x,theta,a,b;rn char op[]='-','*','+','/','(',')','#';rn optr=opnd=(struct stack *)malloc(sizeof(struct stack));rn optr->top=0;rn opnd->top=0;rn push(optr,'#');rn c=getchar();rn while((c!='#')||(gettop(*optr)!='#'))rn if(!in(c,op)) push(opnd,c);c=getchar();rn elsern switch(precede(gettop(*optr),c))rn case '<': push(optr,c);c=getchar();break;rn case '=': pop(optr,&x);c=getchar();break;rn case '>': pop(optr,&theta);pop(opnd,&b);pop(opnd,&a);rn push(opnd,opre(a,theta,b));break;rn rn rn c=gettop(*opnd);rn printf("c=%d",c);rn rn char gettop(struct stack s)rn return(s.a[s.top]);rn int in(char c,char *op)rn int i=0;rn while(i<7)rn if(c==op[i]) return(1);rn return(0);rn rn void push(struct stack *s,char c)rn s->a[s->top]=c;s->top++;rn void pop(struct stack *s, char *x)rn s->top--;*x=s->a[s->top];rn char oper(int a,char theta,int b)rn rn switch(theta)rn case '+':return(a+b-'0');rn case '-':return((a-b+'0'));rn case '*':return((a-'0')*(b-'0')+'0');rn case '/':return((a-'0')/(b-'0')+'0');rn rn rn char precede(char z,char c)rn char x;rn switch(z)rn case '*':rn case '/':switch(c)rn case '*':rn case '/':rn case '-':rn case '+':x='>';break;rn case '(':x='<';break;rn case '#':rn case ')':x='>';break;rn break;rn rn case '-':rn case '+': switch(c)rn case '*':rn case '/': x='<';break;rn case '-':rn case '+': x='>';break;rn case '(': x='<';break;rn case '#':rn case ')': x='>';break;rn break;rn rn case '(': switch(c)rn case '*':rn case '/':rn case '+':rn case '-':rn case '#':x='<';break;rn break;rn rn case ')': switch(c)rn case '*':rn case '/':rn case '+':rn case '-':rn case '#':x='=';break;rn break;rn rn case '#':rn switch(c)rn case '*':rn case '/':rn case '+':rn case '-':rn case '(':rn case '#':x='<';break;rn break;rn rn rn return(x);rn rn
中缀算术表达式求值(Java实现)
目录: 环境及配置 原理及步骤 代码 运行结果 1. 环境及配置: 语言:Java IDE:eclipse 所用数据结构:Stack(栈) 2.原理及步骤: 中缀表达式就是我们日常生活中使用的习惯性的表达式,例如:1 + 2 * 3,这里我们实现从键盘接受一段中缀表达式,并对其进行求值,输出结果。 具体步骤如下: 首先从键盘接受一段中缀表达式。使用
中缀表达式字符串解析求值
对表达式字符串进行解析并对解析所得表达式求值
算术表达式求值(2)
用c语言做的算术表达式求值
算术表达式求值(1)
用c语言做的算术表达式求值
算术表达式求值(数据结构课程设计)
以字符串表示算术表达式,在此基础上借助栈完成对表达式的转换和求值操作。要求设计类(或类模板)来描述算术表达式及其操作,包含必要的构造函数和析构函数,以及其他能够完成如下功能的成员函数: (1)输入算术表达式(中缀表示)(2)中缀表达式转换为后缀表达式(3)输出表达式(4)对后缀表达式求值 并设计主函数测试该类。
带括号的算术表达式求值
采用算符优先数算法,能正确求值表达式 带括号的算术表达式求值
算术表达式的求值数据结构课程设计
源代码文档齐全== 通过文本文档输入复杂表达式均可- 执行程序后输出结果。
算术表达式的求值法
如(6*2+5*9)/2的这类表达式称为中序表示法,这是一般人所习惯的的写法。不过由于中序法优先权和结合性的问题,在计算机编译程序的处理上很不方便,所以在计算机的上的解决之道是将其换成后序法(较常用)和前序法,这种表达式的种类,依据运算符在表达式中的位置,可以将其分为中序法、前序法、后续法。 中序法:&amp;lt;操作数1&amp;gt;&amp;lt;运算符&amp;gt;&amp;lt;操作数2&amp;gt; 前序法:&amp;lt;运算符...
简单的算术表达式求值
Dijkstra 双栈算数表达式求值法 输入输出采用了 算法4 java库package first_java; import java.util.Stack; import edu.princeton.cs.algs4.StdIn; import edu.princeton.cs.algs4.StdOut; public class Evaluate { public static vo...
算术表达式求值 算术 表达式
stack算术表达式求值 算术 表达式算术 表达式
数据结构课程设计—算术表达式求值
算术表达式求值:一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符,如:引入表达式起始、结束符是为了方便。编程利用“算符优先法”求算术表达式的值。要求:从键盘读入一个合法的算术表达式,输出正确的结果。显示输入序列和栈的变化过程。选作内容:操作数类型扩充到实数
C/C++算术表达式求值
以下是程序代码:#includern#includern#includern#define null 0rn#define max 100rntypedef struct date /*定义字符栈*/rnrn char sk[max];rn int top;rnseqstack;rntypedef struct da /*定义数据栈*/rnrn int sk[max];rn int top;rnstack;rnvoid push(seqstack *s,char x) /*进栈*/rnrn if(s->top==max-1)rn rn printf("out of space.\n");rn rn s->top++;rn s->sk[s->top]=x;rnrnvoid spush(stack *s,int x) /*进栈*/rnrn if(s->top==max-1)rn rn printf("sout of space.\n");rn rn s->top++;rn s->sk[s->top]=x;rnrnchar pop(seqstack *s ,char c) /*出栈*/rnrn if(s->top==-1)rn rn printf("no element.\n");return 0;rn rn elsern rn c=s->sk[s->top];rn s->top--;rn return c;rn rnrnint spop(stack *s ,int c) /*出栈*/rnrn if(s->top==-1)rn rn printf("sno element.\n");return 0;rn rn elsern rn c=s->sk[s->top];rn s->top--;rn return c;rn rnrnint pp(char c) /*判断字符*/rnrn switch(c)rn rn case '#':return 0;break;rn case '+':return 2;break;rn case '-':return 2;break;rn case '*':return 3;break;rn case '/':return 3;break;rn case '(':return 1;break;rn case ')':return 4;break;rn default:return 9;break;rn rnrnint yunsuan(int a,char b,int c) /*运算*/rnrn switch(b)rn rn case '+':return a+c;break;rn case '-':return a-c;break;rn case '*':return a*c;break;rn default:return a/c;break;rn rnrnchar bijiao(seqstack *f,char c) /*比较优先级*/rnrn int m,n;rn char w;rn m=pp(c);rn w=f->sk[f->top];rn n=pp(w);rn if(n';rn return '<';rnrnvoid main()rnrn int x,s;rn int q,w;rn int p=0; /*标示变量*/rn char ch,th,d;rn seqstack *h;rn h=(seqstack*)malloc(sizeof(seqstack));rn if(!h) printf("no creat");rn h->top=-1;rn stack *g;rn g=(stack*)malloc(sizeof(stack));rn if(!g) printf("no door");rn g->top=-1;rn push(h,'#');rn ch=getchar();rn while(ch!='\n')rn rn if(pp(ch)==9)rn rn if(p>0)rn rn x=spop(g,x);rn spush(g,10*x+ch-48);rn rn elsern rn spush(g,ch-48);rn p++;rn rn rn if(pp(ch)==1)rn push(h,ch);p=0;rn if(pp(ch)==4)rn rn while(pp(h->sk[h->top])!=1)rn rn q=spop(g,q);rn w=spop(g,w);rn th=pop(h,th);rn spush(g,yunsuan(w,th,q));rn rn d=pop(h,d);p=0;rn rn if(pp(ch)!=9&&pp(ch)!=1&&pp(ch)!=4)rn rn switch(bijiao(h,ch))rn rn case '>':push(h,ch);p=0;break;rn case '<':rn while(pp(h->sk[h->top])>=pp(ch))rn rn q=spop(g,q);w=spop(g,w);rn th=pop(h,th);rn spush(g,yunsuan(w,th,q));rn rn push(h,ch); p=0;break;rn rn rn ch=getchar();rn rn while(ch=='\n'&&h->sk[h->top]!='#')rn rn q=spop(g,q);w=spop(g,w);rn th=pop(h,th);rn s=yunsuan(w,th,q);rn spush(g,s);rn rn printf("the answer is %d\n",g->sk[g->top]);rnrnrn这个代码我用VC++.net调试时有错误,可是我不知道该怎么改。
关于算术表达式的求值问题
#include rn#define maxsize 100rnrntypedef structrnrn char ch [maxsize];rn int top;rnoptr;rntypedef structrnrn int num [maxsize];rn int top;rnopnd;rnrnchar s1 [maxsize];rnchar s2 [maxsize];rnoptr stk1;rnopnd stk2;rnrnoptr initoptr()rnrn optr s;rn s.top=-1;rn return s;rnrnopnd initopnd()rnrn opnd s;rn s.top=-1;rn return s;rnrnrnvoid push1(char c)rnrn if(stk1.top>=maxsize)rn printf("运算符栈满");rn stk1.top=stk1.top+1;rn stk1.ch[stk1.top]=c;rnrnvoid push2(int x)rnrn if(stk2.top>=maxsize)rn printf("操作数栈满");rn stk2.top=stk2.top+1;rn stk2.num[stk2.top]=x;rnrnrnchar pop1()rnrn char c;rn if(stk1.top<0)rn printf("运算符栈为空");rn c=stk1.ch[stk1.top];rn stk1.top--;rn return c;rnrnint pop2()rnrn int x;rn if(stk2.top<0)rn printf("操作数栈为空");rn x=stk2.num[stk2.top];rn stk2.top--;rn return x;rnrnrnvoid postfix()//把算法表达式转换成无括号的表达式rnrn char pop1();rn int pop2();rn int i=0,j=0;rn push1('(');rn dorn rn while(s1[i]<='9'&&s1[i]>='0')rn rn s2[j]=s1[i];rn i++;rn j++;rn rn s2[j]=' ';rn j++;rn switch(s1[i])rn rn case'+':while(stk1.ch[stk1.top]!='(')rn rn s2[j]=pop1();rn j++;rn rn push1(s1[i]);rn i++;rn break;rn case'-':while(stk1.ch[stk1.top]!='(')rn rn s2[j]=pop1();rn j++;rn rn push1(s1[i]);rn i++;rn break;rn case'*':rn case'/':rn while((stk1.ch[stk1.top]=='*')||(stk1.ch[stk1.top]=='/'))rn rn s2[j]=pop1();rn j++;rn rn push1(s1[i]);rn i++;rn break;rn case')':while(stk1.ch[stk1.top]!='(')rn rn s2[j]=pop1();rn j++;rn rn push1(s1[i]);rn pop1();rn i++;rn break;rn case'(':push1(s1[i]);rn i++;rn break;rn default:break;rn rn while(s1[i]!='#');rn while(stk1.ch[stk1.top]!='(')//将转换的无括号表达式存放在s2中rn rn s2[i]=pop1();rn i++;rn rn s2[j]='#';rnrnvoid calculate()//计算表达式值算法rnrn int x,y,z,i,m;rn i=0;rn while(s2[i]!='#')rn rn m=0;rn while(s2[i]!=' '&&s2[i]!='#')rn rn if(s2[i]>='0'&&s2[i]<='9')rn rn m=m*10+s2[i]-'0';rn i++;rn push2(m);rn rn elsern rn if(stk2.top>=1)rn rn x=pop2(stk2);//从操作数栈中取出两个操作数rn y=pop2(stk2);rn switch(s2[i])//根据运算符计算rn rn case'+':z=y+x;break;rn case'-':z=y-x;break;rn case'*':z=y*x;break;rn case'/':z=y/x;break;rn default:break;rn rn push2(z);rn rn i++;rn rn rn if(s2[i]!='#')i++;rn rnrnvoid result()//输出表达式计算结果rnrn int v;rn v=pop2();rn printf("结果为:%d\n",v);rnrnvoid main()//主程序rnrn stk1=initoptr();rn stk2=initopnd();rn printf("输入表达式:");rn gets(s1);rn postfix();rn calculate();rn result();rnrnrnrn这个程序语法上没有错误,是逻辑上的错误,但我实在找不出来,rn计算的结果如下:rn输入 结果rn3+2# 5rn3*2# 6rn3*(7-2)# 5 rn2*3/2+9# 9rnrnrn希望大家帮我找一下错在什么地方rn
算术表达式求值问题请教~~
进行简单的四则运算我知道是不难实现的,但是怎样能够实现乘方,求绝对值以及允许运算量为变量呢?rn我实现想不明白,尤其是乘方问题,请各位指教~~
算术表达式求值演示
数据结构实践里面的作业,算术表达式求值演示,很不错的代码,附加较详细的注释
数据结构算术表达式求值实验报告
问题描述:以字符序列的形式从终端输入语法正确的、不含变量的整数算术表达式,编写程序求出该表达式的后缀表达式;计算最后的结果。 基本要求: 1、 表达式中至少包含加、减、乘、除四种基本运算 2、 表达式中括号的层次至少为2层 3、 能够判断算术表达式正确与否 4、 对于错误表达式给出提示 5、 输出后缀表达式 6、 计算结果
算术表达式求值源码+实验报告
代码可靠完整,个人手写实现,包括小数计算,下面是测试用例: //10*8^2+16.3+5*(5.2*5+3.01)/4-(-10)+0.1000060+4.00416-40 = 666.666666 //100+(-100)-(-10^2) = 100 //(((2016-2017+(((2015-2014)))))) = 0 //-1+(((((((((1^0))))))))+100^2 = 0
算法中算术表达式求值
按《算法》一书流程所写,我觉得我理解的没错。。。可是num栈,即存数字的栈,出栈的数字总是不对,我怀疑我对c++中的stack理解有问题==,求各位指点rn[code=c]rn#ifndef EVALUATErn#include rn#include rn#include rnusing namespace std;rnint Evaluate(string s) rn stack num;rn stack op;rn int v1;rn int v2;rn int v;rn char c;rn for (int i = 0; s[i] != '\0'; i++) rn if (s[i] == '(');rn else if ((s[i] == '+') ||( s[i] == '-') || (s[i] == '*') || (s[i] == '/')) rn op.push(s[i]);rn rn else if (s[i] == ')') rn v1 = num.top();rn num.pop();rn v2 = num.top();rn num.pop();rn c = op.top();rn op.pop();rn if (c == '+') rn v = v2+v1;rn rn else if (c == '-') rn v = v2-v1;rn rn else if (c == '*') rn v = v2*v1;rn rn else if (c == '/') rn v = v2/v1;rn rn num.push(v);rn rn elsern num.push(s[i]);rn rn return num.top();rnrn#endif EVALUATErn[/code]
数据结构 算术表达式求值
表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。
算术表达式求值演示课程设计
详细的课程设计报告,源程序按照要求,正确
简单算术表达式求值
简单算术表达式求值 总时间限制: 1000ms 内存限制: 65536kB 描述 两位正整数的简单算术运算(只考虑整数运算),算术运算为: +,加法运算; -,减法运算; *,乘法运算; /,整除运算; %,取余运算。 算术表达式的格式为(运算符前后可能有空格): 运算数 运算符 运算数 请输出相应的结果。 输入一行算术表达式。
算术表达式转后缀表达式求值
数据结构c语言算术表达式求值(转化为后缀表达式的方法)(双栈:符号栈和数据栈)
数据结构中的算术表达式求值
此算术表达式求值是利用c语言实现,网上有很多这样的程序,但是他们所说的思路与实现全都不一样。本例的思想方法是利用栈进行操作,设有两个栈,一个符号,一个数字栈!用户输入算术表达式后,对其进行解析,经将数字入数字栈,符号入符号,若要入栈的优先级第低于栈顶的元素的符号,则将栈顶符号出栈,经数字栈出两个数字进栈,将所得的结果入数字栈。这样知道算术表达式扫描完,并且当符号栈中没有算术运算符号时,则数字栈中的值就是这个算术表式的值。本例也考虑到了加括号的方式
相关热词 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池 c#5.0 安装程序 c# 分页算法