您的位置:首页 > 编程语言 > Java开发

中缀表达式转后缀表达式java精确实现

2016-10-22 10:42 471 查看
package cn.itcast.StackAndQuen;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
* Created by likailong on 2016/10/16.
* 中缀表达式到后缀表达式
*/
public class MathCaculate {
public static void main(String [] args){
Scanner san=new Scanner(System.in);//键盘读入
List<Character> list=new ArrayList<>();//将中缀表达式变成后缀表达式用数组存储
String input = san.next();//得到输入的信息
char[] shuju = input.toCharArray();//输入的所有信息放入char数组里
int priority=0;//标记符号的的优先级
MyStack<Character>mystack=new MyStack<>();//符号优先级栈
MyStack<Integer>caculatestack=new MyStack<>();//计算后缀表达式栈
int special=0;
for(int i=0;i<shuju.length;i++){//达到键盘输入的每个数据
if(getPriority(shuju[i])!=0){//的到每个数据的优先级
if(getPriority(shuju[i])>=priority&&getPriority(shuju[i])!=3){//如果得到的是个运算符 与栈顶优先级比较
priority=getPriority(shuju[i]);//如果大于等于栈顶优先级 入栈 反之出栈
mystack.push(shuju[i]);
}else if((getPriority(shuju[i])==3&&priority!=3&&special!=3)||(getPriority(shuju[i])!=3&&priority==3&&special!=3)){
special=getPriority(shuju[i]);//如果大于等于栈顶优先级 入栈 反之出栈
mystack.push(shuju[i]);
}
else if(getPriority(shuju[i])==3&&special==3){
//如果大于等于栈顶优先级 入栈 反之出栈
while (!mystack.isEmpty()){//出栈操作
char num=mystack.pop();
list.add(num);
System.out.print(num);
}
}
else{
while (!mystack.isEmpty()){//出栈操作
char num=mystack.pop();
list.add(num);
System.out.print(num);
}
mystack.push(shuju[i]);
}
}else{
System.out.print(shuju[i]);//如果是数字直接输出 用数组接收
list.add(shuju[i]);
}
}
while (!mystack.isEmpty()){
char fuhao=mystack.pop();
list.add(fuhao);
System.out.print(fuhao);
}
System.out.println();
for(int i=0;i<list.size();i++){//运算方法  把存在数组中的后缀表达式遍历
String nums=list.get(i).toString();//每个元素转换成字符串方便后面的Integer.parseInt(nums);
char num=list.get(i);
if(num=='('||num==')'){
list.remove(i);
}
if('0'<=num&&num<='9'){//字符串比较应该这么写
int numss=Integer.parseInt(nums);//字符串转数字
caculatestack.push(numss);//入栈
}else {
int shuju1=caculatestack.pop();//出栈
int shuju2=caculatestack.pop();
char caculate=list.get(i);
int numadd=0;
if(caculate=='+'){//判断数组中的运算符 执行相关操作
numadd=shuju1+shuju2;
}else if(caculate=='-'){
numadd= shuju2-shuju1;
}else if(caculate=='*'){
numadd= shuju1*shuju2;
}else if(caculate=='/'){
numadd=shuju1/shuju2;
}
caculatestack.push(numadd);
}
}
System.out.println(caculatestack.pop());//得到栈顶元素及就是答案
}
private static int getPriority(char shuju) {//的输入的每个字符的优先级
int priority=0;
char num=shuju;
if(0<=num&&num<=9){
}else {
switch (num){
case '-':
case '+':
return priority=1;
case '/':
case '*':
return priority=2;
case '(':
case ')':
return priority=3;
default:priority=0;
}
}
return priority;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: