很久之前写的中缀转后缀以及计算表达式,但是还不完善,转的时候利用了ASCII码,所以只能实现带括号,乘号和加号的计算。发出来,先留个备份,后续改进。
package Stack;
/**
* @author zz384dian
* @time 2018-1-30
* @content 后缀表达式
*/
import java.util.Scanner;
import java.util.Stack;
public class After {
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
//MidtoAft(s);
CalAft(s);
}
//1+2*3+(4*5+6)*7
public static String MidtoAft(String str){
Stack s = new Stack();
String newStr = "";
char c[] = str.toCharArray();
int i = 0;
while(i<c.length){
if(c[i] >= '0'&&c[i] <= '9'){
newStr += c[i];
}
else if(c[i] == ')'){
while(!s.empty() && (char)s.peek() != '('){
char s1 = (char)s.pop();
newStr += s1;
}
if(!s.empty())
s.pop();
}
else{//优先级高的出栈 * ASii小
// +数大 > *数小 出栈 栈顶*大于到的+出栈
while(!s.empty()&&(char)s.peek() <= c[i]){
if((char)s.peek() == '('){
//s.pop();
break;
}else{
char s1 = (char)s.pop();
newStr += s1;
}
}
s.push(c[i]);
}
i++;
}
while(!s.empty()){
newStr += (char)s.pop();
}
return newStr;
}
public static void CalAft(String str){
String str1 = MidtoAft(str);
Stack s = new Stack();
System.out.println(str1);
char c[] = str1.toCharArray();
int i = 0;
int sum = 0;
while(i < c.length){
if(c[i] >= '0'&&c[i] <= '9'){
s.push(c[i]);
}
else if(c[i] == '+'){
if(!s.empty()){
Integer a = Integer.parseInt(String.valueOf(s.pop()));
Integer b = 0;
if(!s.empty()){
b = Integer.parseInt(String.valueOf(s.pop()));
}
sum = a+b;
s.push(sum);
System.out.println("add:"+i+" "+sum);
}
}
else if(c[i] == '*'){
if(!s.empty()){
Integer a = Integer.parseInt(String.valueOf(s.pop()));
Integer b = 0;
if(!s.empty()){
b = Integer.parseInt(String.valueOf(s.pop()));
}
sum = a*b;
s.push(sum);
System.out.println("mul:"+i+" "+sum);
}
}
i++;
}
if(!s.empty())
System.out.println(s.pop());
}
}