中缀表达式:5*(((9*8+5)*(4+6))+7),即中缀表达式就是我们日常习惯输入的那种
转化为后缀表达式:598*5+46+*7+*
思路:
1.如果输入为数字:
即可以直接输出
2.如果输入的是'('
直接入栈
3.如果输入为‘):
我们输入依次从栈中弹出栈顶元素,直到栈顶元素为'(',记住‘(’也需要弹出
4.如果输入为‘+’,‘-’,‘*’,‘/’:
我们需要从栈中取出栈顶元素,比较栈顶元素与输入字符的优先级,如果栈顶元素优先级高,我们需要将其弹出,
直到栈顶元素优先级低于输入字符或者栈中元素为空,
输入示例:5*(((9*8+5)*(4+6))+7)
输出:598*5+46+*7+*
代码:
package Stack;
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String input = scan.next();
Stack stack = new Stack();
String str;
char[] arr = input.toCharArray();
for(int i=0;i<arr.length;i++){
if(arr[i]>='0'&&arr[i]<='9'){
System.out.print(arr[i]);
}
if(arr[i]=='('){
stack.push(arr[i]+"0");
}
//栈顶比输入字符的优先级高的出栈
if(arr[i]=='+'||arr[i]=='-'){
if(stack.isEmpty()){
stack.push(arr[i]+"1");
}else {
while((str=stack.getTop().toString()).charAt(1)>='1'){
stack.pop();
System.out.print(str.charAt(0));
if(stack.isEmpty()){
break;
}
}
stack.push(arr[i]+"1");
}
}//后面为其的优先级
if(arr[i]=='*'||arr[i]=='/'){
if(stack.isEmpty()){
stack.push(arr[i]+"2");
}else {
while((str=stack.getTop().toString()).charAt(1)>='2'){
stack.pop();
System.out.print(str.charAt(0));
if(stack.isEmpty()){
break;
}
}
stack.push(arr[i]+"2");
}
}
if(arr[i]==')'){
while(!(str=stack.getTop().toString()).equals("(0")){
stack.pop();
System.out.print(str.charAt(0));
}
stack.pop();
}//if
}//for
while(!stack.isEmpty()){
System.out.print(stack.pop().toString().charAt(0));
}
}
}
stack类:
代码:
package Stack;
import java.util.LinkedList;
public class Stack {
//先进后出
LinkedList linkList = new LinkedList();
public void push(Object object){
linkList.addFirst(object);
}
public boolean isEmpty(){
return linkList.isEmpty();
}
public Object pop(){
if(!linkList.isEmpty()){
return linkList.removeFirst();
}else{
return linkList.isEmpty();
}
}
public int getSize(){
return linkList.size();
}
public Object getTop(){
if(!linkList.isEmpty()){
return linkList.getFirst();
}else{
return linkList.isEmpty();
}
}
}