import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Expression{
public static void main(String args[]){
//得到输入的算数表达式
String s=new String();
System.out.println("输入算数表达式:");
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
try {
s=bf.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//通过正则表达式判断输入的是否正确
Pattern p=Pattern.compile("([1-9][0-9]*[+\\-\\*/])+[1-9][0-9]*");
Matcher m=p.matcher(s);
if((m.matches()==true)){
Expression ex=new Expression();
ex.getExpression(s);
}else{
System.out.println("表达式输入有误!");
}
}
//把算数表达式转化为后缀式(逆波兰式)
private String getExpression(String expression){
//存放操作符的栈
Stack<Character> s1=new Stack<Character>();
Stack<Object> s2=new Stack<Object>();
int len=expression.length();
//System.out.println(len);
char c1;
for(int i=0;i<len;i++){
c1=expression.charAt(i);
//s1.push('#');
System.out.println(c1);
if(isOperator(c1)==true){
//System.out.println(c1);
//操作数为操作符且优先级比s1栈顶操作符优先级高时,直接把操作符压入s1
if(s1.empty()){
s1.push(c1);
//System.out.println(c1);
}
else {
if(priorityCompare(c1,s1.peek())==1){
s1.push(c1);
//System.out.println(s1.peek());
}
else{
//弹出s1栈顶的操作符并压入s2,直到c1优先级小于s1栈顶的操作符优先级
while(priorityCompare(c1,s1.peek())!=1){
s2.push(s1.pop());
System.out.println(s2.peek());
}
s1.push(c1);
//System.out.println(s1.peek());
}
}
}else{
//若操作数为数字,直接压入s2中
s2.push(c1);
//System.out.println(c1);
}
}
//把s1中剩余的元素压入s2中
while(!s1.isEmpty()){
s2.push(s1.pop());
//System.out.println(s1.peek());
}
return count_result(s2);
}
//根据后序的计算出结果
private String count_result(Stack<Object> ob) {
//存放后序的栈
Stack<Object> s3=new Stack<Object>();
//计算结果的栈
Stack<Double> s4=new Stack<Double>();
while(!ob.isEmpty()){
s3.push(ob.pop());
}
while(!s3.isEmpty()){
if(!isOperator(s3.peek())){
s4.push((Double)(s3.pop()));
}
else{
s4.push(cout(s4.pop(),s4.pop(),(char)s3.pop()));
}
}
return Double.toString(s4.peek());
} private Double cout(double x, double y, char z) {
double result=0;
switch(z){
case '+':
result=x+y;
break;
case '-':
result=x-y;
break;
case '*':
result=x*y;
break;
case '/':
result=x/y;
break;
}
//System.out.println(result);
return result;
}
//比较两个操作符的优先级
private int priorityCompare(char c1, char c2) {
switch(c1){
case '+':
case '-':
return(c2=='*'||c2=='/'?-1:0);
case '*':
case '/':
return(c2=='+'||c2=='-'?1:0);
}
return 1;
//return getPriority(c1) - getPriority(c2);
}
/*int getPriority(char c) {
if(c == '+' || c == '-')
return 1;
else
return 2;
}*/
//检测是否是操作符
private boolean isOperator(Object o){
//System.out.println("isO:"+o);
char c1=(char)o;
//System.out.println("isO:"+c1);
if(c1=='+'||c1=='-'||c1=='*'||c1=='/'){
//System.out.println("yes");
return true;
}
else{
//System.out.println("no");
return false;
}
}
}
一直有错,请帮忙看看
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Expression{
public static void main(String args[]){
//得到输入的算数表达式
String s=new String();
System.out.println("输入算数表达式:");
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
try {
s=bf.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//通过正则表达式判断输入的是否正确
Pattern p=Pattern.compile("([1-9][0-9]*[+\\-\\*/])+[1-9][0-9]*");
Matcher m=p.matcher(s);
if((m.matches()==true)){
Expression ex=new Expression();
System.out.println(ex.getExpression(s));
}else{
System.out.println("表达式输入有误!");
}
}
//把算数表达式转化为后缀式(逆波兰式)
private String getExpression(String expression){
//存放操作符的栈
Stack<Character> s1=new Stack<Character>();
Stack<Object> s2=new Stack<Object>();
int len=expression.length();
//System.out.println(len);
char c1;
for(int i=0;i<len;i++){
c1=expression.charAt(i);
//s1.push('#');
System.out.println(c1);
if(isOperator(c1)==true){
//System.out.println(c1);
//操作数为操作符且优先级比s1栈顶操作符优先级高时,直接把操作符压入s1
if(s1.empty()){
s1.push(c1);
//System.out.println(c1);
}
else {
if(priorityCompare(c1,s1.peek())==1){
s1.push(c1);
//System.out.println(s1.peek());
}
else{
//弹出s1栈顶的操作符并压入s2,直到c1优先级小于s1栈顶的操作符优先级
while(priorityCompare(c1,s1.peek())!=1){
s2.push(s1.pop());
System.out.println(s2.peek());
}
s1.push(c1);
//System.out.println(s1.peek());
}
}
}else{
//若操作数为数字,直接压入s2中
s2.push(c1);
//System.out.println(c1);
}
}
//把s1中剩余的元素压入s2中
while(!s1.isEmpty()){
s2.push(s1.pop());
//System.out.println(s1.peek());
}
return count_result(s2);
}
//根据后序的计算出结果
private String count_result(Stack<Object> ob) {
//存放后序的栈
Stack<Object> s3=new Stack<Object>();
//计算结果的栈
Stack<Double> s4=new Stack<Double>();
while(!ob.isEmpty()){
s3.push(ob.pop());
}
while(!s3.isEmpty()){
if(!isOperator(s3.peek())){
s4.push((Double.parseDouble(((Character)s3.pop()).toString())));
}
else{
s4.push(cout(s4.pop(),s4.pop(),(Character)s3.pop()));
}
}
return Double.toString(s4.peek());
} private Double cout(double x, double y, char z) {
double result=0;
switch(z){
case '+':
result=x+y;
break;
case '-':
result=x-y;
break;
case '*':
result=x*y;
break;
case '/':
result=x/y;
break;
}
//System.out.println(result);
return result;
}
//比较两个操作符的优先级
private int priorityCompare(char c1, char c2) {
switch(c1){
case '+':
case '-':
return(c2=='*'||c2=='/'?-1:0);
case '*':
case '/':
return(c2=='+'||c2=='-'?1:0);
}
return 1;
//return getPriority(c1) - getPriority(c2);
}
/*int getPriority(char c) {
if(c == '+' || c == '-')
return 1;
else
return 2;
}*/
//检测是否是操作符
private boolean isOperator(Object o){
//System.out.println("isO:"+o);
char c1=(Character)o;
//System.out.println("isO:"+c1);
if(c1=='+'||c1=='-'||c1=='*'||c1=='/'){
//System.out.println("yes");
return true;
}
else{
//System.out.println("no");
return false;
}
}
}