String解析 已知用户输入的一个表达式类型的字符串例如(3+4)*5或(2+4)/3一个程序接收这个字符串后输出其运算的结果。这个程序该怎么写? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这就是表达式的解析两种方案,一种利用堆栈+符号优先级进行处理另外一种利用递归~写计算器的时候用过后一种,你可以参考下http://blog.sina.com.cn/s/blog_4ab057eb0100aopz.htmlhttp://blog.sina.com.cn/s/blog_4ab057eb0100b0vp.html 嗯,可以用栈解决,但是如果我从stack中取出一个+,这是这个+是一个运算符还是一个字符?是不是可以写成这样char i='+';如果我要用+来连接3和5,是不是可以这样写:int n=3i5;如果不能,那又该怎么写呢? 这是我以前写得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;} 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); }} 现在表达式引擎那么多,效率也很好,无需自己写ScriptEngineManager是jdk1.6中才有的,如果在1.5中使用,可以下载bsf-api,jexl,使用jexl这个表达式引擎来计算,代码只需将上面的js改成jexl就OK,如果使用js也没问题,下载一个js引擎 javascript中^是什么运算它就是什么运算,可以肯定不是平方 perl的问题求解决 java风扇程序 讨论下Jtable的一个问题 一个普通的APPLET,导致IE闪烁!!! String a="a";和String a=new String("a");的区别是什么? 為什么compareToIgnoreCase用不了 @@@一个小问题@@@ String是引用数据类型 但是是值传递 怎么理解? 【求助】 array绕来绕去绕晕了 java中有没有做报表的好工具 错误:java.net.SocketException: Connection reset File读取共享文件夹下的问题,大侠帮忙,先谢了!
两种方案,一种利用堆栈+符号优先级进行处理
另外一种利用递归~写计算器的时候用过后一种,你可以参考下
http://blog.sina.com.cn/s/blog_4ab057eb0100aopz.html
http://blog.sina.com.cn/s/blog_4ab057eb0100b0vp.html
是不是可以写成这样char i='+';
如果我要用+来连接3和5,是不是可以这样写:int n=3i5;
如果不能,那又该怎么写呢?
#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;
}
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);
}
}
ScriptEngineManager是jdk1.6中才有的,如果在1.5中使用,可以下载bsf-api,jexl,使用jexl这个表达式引擎来计算,代码只需将上面的js改成jexl就OK,如果使用js也没问题,下载一个js引擎