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;
}
}
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;
}
}
阅读全文
0 0
- Java 中缀表达式转后缀表达式 + 中/后缀表达式计算
- 中缀表达式转后缀表达式及后缀表达式的计算
- 中缀表达式转后缀表达式,并计算后缀表达式值
- 中缀表达式转后缀表达式 && 后缀表达式计算
- 中缀表达式转后缀表达式并计算
- 中缀表达式转后缀表达式及其计算
- 中缀表达式转后缀表达式 (中缀表达式的计算)
- Java中缀转后缀表达式
- java实现中缀表达式转后缀表达式并且计算
- Java实现中缀表达式转后缀表达式并计算结果
- java中缀表达式转后缀表达式
- java 中缀表达式转后缀表达式
- JAVA中缀表达式转后缀表达式
- 中缀表达式转后缀表达式--Java
- Java中缀表达式转后缀表达式
- java中缀表达式转后缀表达式
- 中缀转后缀表达式
- 表达式中缀转后缀
- 指滑轮播图
- 大型分布式网站技术架构笔记(一)
- 102- Binary Tree Level Order Traversal
- flask初探
- Leetcode-Search in Rotated Sorted Array&&Search in Rotated Sorted ArrayII
- Java 中缀表达式转后缀表达式 + 中/后缀表达式计算
- java开发遭遇瓶颈
- mysql:mysql is neither service nor target!?(suse12 sp2 )
- 20171219
- Large Kernel Matters —— Improve Semantic Segmentation by Global Convolutional Network论文阅读
- 条件语句-“平面骰子”-时间模块-随机模块
- windows 10 安装 spark 环境(spark 2.2.1 + hadoop2.7)
- snprintf()和sprintf()学习
- pow