逆波兰表达式

Posted dean-sunpeishuai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逆波兰表达式相关的知识,希望对你有一定的参考价值。

2:逆波兰表达式

总时间限制:
1000ms
内存限制:
65536kB
描述
逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符包括+ - * /四个。
输入
输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。
输出
输出为一行,表达式的值。
可直接用printf("%f ", v)输出表达式的值v。
样例输入
* + 11.0 12.0 + 24.0 35.0
样例输出
1357.000000
提示
可使用atof(str)把字符串转换为一个double类型的浮点数。atof定义在math.h中。
此题可使用函数递归调用的方法求解。
此题有错:应该是波兰表达式。还有输出保留6位小数。
本人代码:
技术图片
import java.util.Scanner;
import java.util.Stack;
public class Main {
  public static void main(String[]args) {
      Scanner sc=new Scanner(System.in);
      String []news=sc.nextLine().split(" ");
      Stack<Double>stack=new Stack<Double>();
      for(int i=news.length-1;i>=0;i--)
      {
            if(news[i].equals("+")) {
                  stack.push((stack.pop()+stack.pop()));
              } else if(news[i].equals("-")) {
                  stack.push((stack.pop()-stack.pop()));
              }else if(news[i].equals("*")) {
                  stack.push((stack.pop()*stack.pop()));
              }else if(news[i].equals("/")) {
                  stack.push((stack.pop()/stack.pop()));
              }else {
                    
                      try {
                        stack.push(Double.parseDouble(news[i]));
                    } catch (NumberFormatException e) {
                        // TODO 自动生成的 catch 块
                        continue;
                    }
        
        }
          
      }
        System.out.printf("%.6f
",stack.peek());

    }
 }
View Code

感谢董卫老师的帮助,找出我的bug。注意输出格式。老师代码:

import java.util.Scanner;
import java.util.Stack;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Scanner sc = new Scanner(System.in);
		String[] ss=sc.nextLine().split(" ");
		Stack<Double> st=new Stack<Double>();
		for(int i=ss.length-1;i>=0;i--){
			try{
			  double d=Double.parseDouble(ss[i]);
			  st.push(d);
			}catch(Exception e){
			   if("+".equals(ss[i])){
				   st.push(st.pop()+st.pop());
			   }else if("-".equals(ss[i])){
				   st.push(st.pop()-st.pop());
			   }else if("*".equals(ss[i])){
				   st.push(st.pop()*st.pop());
			   }else{
				   st.push(st.pop()/st.pop());
			   }
			}			
			
		}
		System.out.printf("%.6f
", st.peek());

	}

}

 

以上是关于逆波兰表达式的主要内容,如果未能解决你的问题,请参考以下文章

Java代码实现逆波兰计算器

python实现逆波兰计算表达式的代码

逆波兰表达式

逆波兰计算器

逆波兰计算器

C++栈的应用:逆波兰式的实现