String解析

成一粒 2011-04-20 09:39:48
已知用户输入的一个表达式类型的字符串例如(3+4)*5或(2+4)/3一个程序接收这个字符串后输出其运算的结果。这个程序该怎么写?
...全文
348 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouYunan2010 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 tkd03072010 的回复:]
5^2 这个是什么运算?是5的平方吗
[/Quote]
^位运算符,异或
5和2的2进制补码,按位异或。
wang_huanming 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ticmy 的回复:]
Java code
import javax.script.*;
public class TestScript {
public static void main(String[] args) throws Exception {
String exp = "(1*2)+3/4+5^2";

ScriptEngineManage……
[/Quote]
+1
成一粒 2011-04-26
  • 打赏
  • 举报
回复
谁能没事帮写写代码,我好看代码学习学习,实在不会啊!
zhuzhuiii2007 2011-04-26
  • 打赏
  • 举报
回复
貌似是栈中中缀表达式转换为后缀表达式,然后利用后缀表达式进行运算的结果
daocaorenwh 2011-04-26
  • 打赏
  • 举报
回复
用逆波兰表达式来实现
具体的原理实现自己网上搜的到
zqfddqr 2011-04-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ticmy 的回复:]
现在表达式引擎那么多,效率也很好,无需自己写


ScriptEngineManager是jdk1.6中才有的,如果在1.5中使用,可以下载bsf-api,jexl,使用jexl这个表达式引擎来计算,代码只需将上面的js改成jexl就OK,如果使用js也没问题,下载一个js引擎
[/Quote]恩 啊 有很多表达是计算器如果是老师留的话建议自己写我也写过一个
lliiqiang 2011-04-22
  • 打赏
  • 举报
回复
先用括号分割数据对象,然后是乘除,最后是加减,将其变成运算符类(拥有运算方法)
Cages 2011-04-22
  • 打赏
  • 举报
回复
我记得有个开源的表达式解释器,忘了什么名字了,应该可以解决你的问题,不用自己用波兰式再写算法了
bf234511171 2011-04-22
  • 打赏
  • 举报
回复
好像是用正则给转化出来的!
龙四 2011-04-22
  • 打赏
  • 举报
回复
javascript中^是什么运算它就是什么运算,可以肯定不是平方

[Quote=引用 9 楼 tkd03072010 的回复:]

引用 7 楼 ticmy 的回复:

现在表达式引擎那么多,效率也很好,无需自己写


ScriptEngineManager是jdk1.6中才有的,如果在1.5中使用,可以下载bsf-api,jexl,使用jexl这个表达式引擎来计算,代码只需将上面的js改成jexl就OK,如果使用js也没问题,下载一个js引擎

5^2 这个是什么运算?是5的平方吗
[/Quote]
kakane 2011-04-21
  • 打赏
  • 举报
回复
数据结构 栈那一章 有这个例子 经典问题
jungle依然 2011-04-21
  • 打赏
  • 举报
回复
建一个运算符栈,一个操作数栈,把中缀表达式转成后缀表达式。然后每读一个运算符(双目),取栈顶两个操作数计算再压栈。注意括号的处理就行。这是数据结构的经典例题吧。各种语言的数据结构教材上都有源代码的。
TKD03072010 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ticmy 的回复:]

现在表达式引擎那么多,效率也很好,无需自己写


ScriptEngineManager是jdk1.6中才有的,如果在1.5中使用,可以下载bsf-api,jexl,使用jexl这个表达式引擎来计算,代码只需将上面的js改成jexl就OK,如果使用js也没问题,下载一个js引擎
[/Quote]
5^2 这个是什么运算?是5的平方吗
TKD03072010 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ticmy 的回复:]

Java code
import javax.script.*;
public class TestScript {
public static void main(String[] args) throws Exception {
String exp = "(1*2)+3/4+5^2";

ScriptEngineManager ma……
[/Quote]
这个结果好像有错啊!!!
龙四 2011-04-21
  • 打赏
  • 举报
回复
现在表达式引擎那么多,效率也很好,无需自己写


ScriptEngineManager是jdk1.6中才有的,如果在1.5中使用,可以下载bsf-apijexl,使用jexl这个表达式引擎来计算,代码只需将上面的js改成jexl就OK,如果使用js也没问题,下载一个js引擎
龙四 2011-04-21
  • 打赏
  • 举报
回复
import javax.script.*;
public class TestScript {
public static void main(String[] args) throws Exception {
String exp = "(1*2)+3/4+5^2";

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
Object result = engine.eval(exp);

System.out.println("结果类型:" + result.getClass().getName() + ",计算结果:" + result);
}
}
24K純帥 2011-04-21
  • 打赏
  • 举报
回复
用stack,他有push,pop方法。。
enendala 2011-04-21
  • 打赏
  • 举报
回复
这是我以前写得c++代码,你可以看看,就是利用堆栈+符号优先级进行处理的:
#include<iostream>
using namespace std;
template<class T>
class seqstact
{
private:
T *element;
int size;
int top;
public:
seqstact(int size=64);
~seqstact();
bool isEmpty();
void push(T x);
T pop();
T get();
};
template <class T>
seqstact<T>::seqstact(int size)
{
size=size<64?664:size;
element=new T[size];
top=-1;
}
template <class T>
seqstact<T>::~seqstact()
{
delete [] element;
}
template<class T>
bool seqstact<T>::isEmpty()
{
return top==-1;
}
template<class T>
void seqstact<T>::push(T x)
{
if(top==size-1)
{
T *temp=element;
element=new T[size*2];
for(int i=0;i<size;i++)
element[i]=temp[i];
size*=2;
}
top++;
element[top]=x;
}
template<class T>
T seqstact<T>::pop()
{
if(!isEmpty())
{
T x=element[top];
top--;
return x;
}
else
throw "空栈,不能执行出栈操作";
}
template<class T>
T seqstact<T>::get()
{
if(!isEmpty())
return element[top];
else
throw "空栈,不能执行出栈操作";
}
char *topostfix(char *expstr)
{
seqstact<char> stact;
char *postfix=new char[strlen(expstr)*2];
int i=0;
int j=0;
char out;
while(expstr[i]!='\0')
{
switch(expstr[i])
{
case '+':
case '-':
{
while(!stact.isEmpty()&&stact.get()!='(')
postfix[j++]=stact.pop();
stact.push(expstr[i++]);
break;
}
case '*':
case '/':
{
while(!stact.isEmpty()&&(stact.get()=='*'||stact.get()=='/'))
postfix[j++]=stact.pop();
stact.push(expstr[i++]);
break;
}
case '(':stact.push(expstr[i++]);break;
case ')':
{
out=stact.pop();
while(!stact.isEmpty()&&out!='(')
{
postfix[j++]=out;
out=stact.pop();
}
i++;
break;
}
default:
{
while(expstr[i]>='0'&&expstr[i]<='9'&&expstr[i]!='\0')
postfix[j++]=expstr[i++];
postfix[j++]=' ';
break;
}
}
}
while(!stact.isEmpty())
postfix[j++]=stact.pop();
postfix[j]='\0';
return postfix;
}
int value(char *postfix)
{
seqstact<int> stact;
int i=0,result=0;

while(postfix[i]!='\0')
{
if(postfix[i]>='0'&&postfix[i]<='9')
{
result=0;
while(postfix[i]!=' ')
{
result=result*10+postfix[i++]-'0';
}
i++;
stact.push(result);
}
else
{
if(postfix[i]!=' ')
{
int y=stact.pop();
int x=stact.pop();
switch(postfix[i])
{
case '+':result=x+y;break;
case '-':result=x-y;break;
case '*':result=x*y;break;
case '/':result=x/y;break;
}
stact.push(result);
}
i++;
}
}
return stact.pop();
}
int main()
{
char*expstr="121+10*(53-49+20)/((35-25)*2+10)";
char*postfix=topostfix(expstr);
cout<<"expstr= "<<expstr<<endl;
cout<<"postfix= "<<postfix<<endl;
cout<<"value= "<<value(postfix)<<endl;
return 0;
}
成一粒 2011-04-21
  • 打赏
  • 举报
回复
嗯,可以用栈解决,但是如果我从stack中取出一个+,这是这个+是一个运算符还是一个字符?
是不是可以写成这样char i='+';
如果我要用+来连接3和5,是不是可以这样写:int n=3i5;
如果不能,那又该怎么写呢?
wklken 2011-04-20
  • 打赏
  • 举报
回复
这就是表达式的解析
两种方案,一种利用堆栈+符号优先级进行处理
另外一种利用递归~

写计算器的时候用过后一种,你可以参考下
http://blog.sina.com.cn/s/blog_4ab057eb0100aopz.html
http://blog.sina.com.cn/s/blog_4ab057eb0100b0vp.html

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧