Java 中缀表达式转后缀表达式 + 中/后缀表达式计算

来源:互联网 发布:淘宝千牛是什么 编辑:程序博客网 时间:2024/05/15 07:50
package 表达式运算;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Stack;


import org.junit.Test;


public class InfixInToSuffix {


private int [] isp ={0,1,7,5,5,5,3,3,8};//#(^*/%+-)的栈内优先级
private int [] icp ={0,8,6,4,4,4,2,2,1};//#(^*/%+-)的引入 优先级
private String sOpt = "#(^*/%+-)";


public static void main(String [] args){
InfixInToSuffix test = new InfixInToSuffix();
System.out.println(test.calMidSuffix("3*( 17-2 -5)"));
System.out.println(test.toSuffix("3*( 17-2 - 5 -1)"));
System.out.println(test.calEndSuffix("17.0 2.0 - 5.0 - 3.0 *"));
}
/**
* 将 中缀表达式 转化为 后缀表达式
* @param 中缀表达式
* @return 后缀表达式
*/
public String toSuffix(String infix) {
Stack<Double>  stNum = new Stack<Double>();
Stack<Character>  stOpt = new Stack<Character>();
String sResult = "";
Boolean firstCal = true;
String sInput = infix;
char [] input = sInput.toCharArray();
for(int i=0; i<input.length; i++){
char cInput = input[i];
if(isNum(cInput)){
String tmp = "" + cInput;
for(int j=i+1; j<input.length; j++){
if(isNum(input[j]) || input[j] == '.'){
tmp += input[j];
i = j;
}else{
break;
}
}
stNum.add(Double.valueOf(tmp));
}else if(cInput == ' '){
continue;
}else if(optPosion(cInput) != -1){
if(stOpt.empty() || icp[optPosion(cInput)] > isp[optPosion(stOpt.peek())]){
stOpt.push(cInput);
}else if(icp[optPosion(cInput)] == isp[optPosion(stOpt.peek())]){
stOpt.pop();
}else if(icp[optPosion(cInput)] < isp[optPosion(stOpt.peek())]){
do{
char cOpt = stOpt.pop();
double optNum1 = stNum.pop();
double optNum2 = stNum.pop();
if(firstCal){
sResult = sResult + optNum2 + " "+ optNum1 + " "+ cOpt;
firstCal = false;
}else{
sResult = sResult + " " + optNum1 + " "+ cOpt;
}

stNum.push(calNum(cOpt,optNum1,optNum2));
}while(!stOpt.empty() && icp[optPosion(cInput)] < isp[optPosion(stOpt.peek())]);
if(!stOpt.empty() && icp[optPosion(cInput)] == isp[optPosion(stOpt.peek())]){
stOpt.pop();
}else{
stOpt.push(cInput);
}
}
}
}
while(!stOpt.empty()){
char cOpt = stOpt.pop();
double optNum1 = stNum.pop();
double optNum2 = stNum.pop();
sResult = sResult + " " + optNum2 + " " + cOpt;
stNum.push(calNum(cOpt,optNum1,optNum2));
}
return sResult;
}


/**
* 将 中缀表达式 进行 运算 计算出结果

* @param equation
* @return 表达式运算结果
*/
public String calMidSuffix(String infix) {
Stack<Double>  stNum = new Stack<Double>();
Stack<Character>  stOpt = new Stack<Character>();
String sResult = null;
String sInput = infix ;
char [] input = sInput.toCharArray();
for(int i=0; i<input.length; i++){
char cInput = input[i];
if(isNum(cInput)){
String tmp = "" + cInput;
for(int j=i+1; j<input.length; j++){
if(isNum(input[j]) || input[j] == '.'){
tmp += input[j];
i = j;
}else{
break;
}
}
stNum.add(Double.valueOf(tmp));
}else if(cInput == ' '){
continue;
}else if(optPosion(cInput) != -1){
if(stOpt.empty() || icp[optPosion(cInput)] > isp[optPosion(stOpt.peek())]){
stOpt.push(cInput);
}else if(icp[optPosion(cInput)] == isp[optPosion(stOpt.peek())]){
stOpt.pop();
}else if(icp[optPosion(cInput)] < isp[optPosion(stOpt.peek())]){
do{
char cOpt = stOpt.pop();
double optNum1 = stNum.pop();
double optNum2 = stNum.pop();
stNum.push(calNum(cOpt,optNum1,optNum2));
}while(!stOpt.empty() && icp[optPosion(cInput)] < isp[optPosion(stOpt.peek())]);
if(!stOpt.empty() && icp[optPosion(cInput)] == isp[optPosion(stOpt.peek())]){
stOpt.pop();
}else{
stOpt.push(cInput);
}
}
}
}
while(!stOpt.empty()){
char cOpt = stOpt.pop();
double optNum1 = stNum.pop();
double optNum2 = stNum.pop();
stNum.push(calNum(cOpt,optNum1,optNum2));
}
sResult = String.valueOf(stNum.peek());
stNum.clear();
stOpt.clear();
return sResult;

}
/**
* 运算结果
* @param cOpt 运算符 optNum1 optNum2 运算数
* @return 运算结果

*/
private Double calNum(char cOpt, double optNum1, double optNum2) {
// TODO Auto-generated method stub
switch(cOpt){
case '+':
return optNum2 + optNum1;
case '-':
return optNum2 - optNum1;
case '*':
return optNum2 * optNum1;
case '/':
return optNum2 / optNum1;
default:
return (double) 0;
}
}
/**
* 运算结果
* @param 表达式中的字符
* @return 运算符在isp 和 icp中的位置

*/
private int optPosion(char c) {
// TODO Auto-generated method stub
return sOpt.indexOf(c);
}

/**
* 运算结果
* @param 表达式中的字符
* @return 是否是数字

*/
private boolean isNum(char c) {
// TODO Auto-generated method stub
if(c >= '0' && c <= '9'){
return true;
}
return false;
}
/**
* 将 后缀表达式 进行 运算 计算出结果

* @param equation
* @return
*/
public String calEndSuffix(String infix) {
Stack<Double>  stNum = new Stack<Double>();
String sResult = null;
String sInput = infix;
char [] input = sInput.toCharArray();
for(int i=0; i<input.length; i++){
char cInput = input[i];
if(isNum(cInput)){
String tmp = "" + cInput;
for(int j=i+1; j<input.length; j++){
if(isNum(input[j]) || input[j] == '.'){
tmp += input[j];
i = j;
}else{
break;
}
}
stNum.add(Double.valueOf(tmp));
}else if(cInput == ' '){ //数字分割符
continue;
}else if(optPosion(cInput) != -1){
double optNum1 = stNum.pop();
double optNum2 = stNum.pop();
stNum.push(calNum(cInput,optNum1,optNum2));

}
}
/*while(!stOpt.empty()){
char cOpt = stOpt.pop();
double optNum1 = stNum.pop();
double optNum2 = stNum.pop();
stNum.push(calNum(cOpt,optNum1,optNum2));
}*/
sResult = String.valueOf(stNum.peek());
stNum.clear();
return sResult;

}


}
原创粉丝点击