用栈解决逆波兰表达式问题(Java实现)

1.知识储备
用栈解决逆波兰表达式问题(Java实现)_第1张图片
2.解题思路
用栈解决逆波兰表达式问题(Java实现)_第2张图片
3.程序流程图:
用栈解决逆波兰表达式问题(Java实现)_第3张图片
4.代码实现:

package Stack;

public class ReversePolishNotationTest {
  public static void main(String[] args) {
	//中缀表达式3*(17-15)+18/6的逆波兰表达式如下
	  String[] notation={"3","17","15","-","*","18","6","/","+"};
	  //中缀表达式5*(3+2)-3
	  String[] notation2={"5","3","2","+","*","3","-"};
	  int result=caculate(notation2);
	  System.out.println("逆波兰表达式的结果为:"+result);
   }
  /*
   * notation逆波兰表达式的数组表示
   * 逆波兰表达式的计算结果
   */
  public static int caculate(String[] notation){
	  //1.创建一个栈来存储逆波兰表达式的操作数
	  Stack<Integer> stack=new Stack<Integer>();
	  //2.从左往右依次遍历逆波兰表达式,得到每一个字符
	  for(int i=0;i<notation.length;i++){
		  String curr=notation[i];
		  //3.如果改字符不是运算符那说明是操作数,则将其入栈,否则就弹出栈最上面的两个元素并与该运算符进行计算
		//4.将计算得到的结果再压入到栈中
		  Integer o1;
		  Integer o2;
		  Integer result;
		 switch(curr){
		 case "+":
			  o1=stack.pop();
			  o2=stack.pop();
			  result=o2+o1;
			 stack.push(result);
			 break;
		 case "-":
			 o1=stack.pop();
			  o2=stack.pop();
			  result=o2-o1;
			 stack.push(result);
			 break;
		 case "*":
			 o1=stack.pop();
			  o2=stack.pop();
			  result=o2*o1;
			 stack.push(result);
			 break;
		 case "/":
			 o1=stack.pop();
			  o2=stack.pop();
			  result=o2/o1;
			 stack.push(result);
			 break;
			 default:
				 stack.push(Integer.parseInt(curr));
				 break;
		 }
	 }  
	  //5.遍历结束后拿到最终结果并返回
	  int result=stack.pop();
	  return result ;
  }
}

5.运行结果:
在这里插入图片描述

你可能感兴趣的:(经典程序,算法,数据结构,算法)