• 表达式求值


    这段代码用到的是栈的方法,先将中缀表达式改为后缀表达式,再对后缀表达式求值。

    不多说,看代码:

     1 import java.util.*;
     2 
     3 public class Main {
     4     static Scanner sc = new Scanner(System.in);
     5     
     6     public static int lastvalue(String str){    //后缀表达式求值
     7         Stack<Integer> stack = new Stack<Integer>();
     8         String[] data = str.split(" ");
     9          
    10         for(int i = 0;i < data.length;i++){
    11             if(data[i].charAt(0) >= '0' && data[i].charAt(0) <= '9'){
    12                 //将data[i]转换为int数据
    13                 int m =  Integer.parseInt(data[i]);
    14                 stack.push(m);
    15             }else{
    16                 int a = stack.pop();
    17                 int b = stack.pop();
    18                 //构造b ? a计算结果,,将结果入栈
    19                 switch(data[i].charAt(0)){
    20                     case '+':stack.push(b+a);break;
    21                     case '-':stack.push(b-a);break;
    22                     case '*':stack.push(b*a);break;
    23                     case '/':stack.push(b/a);break;
    24                     case '%':stack.push(b%a);break;
    25                 }
    26             }
    27 //          System.out.println("---list:"+stack);//测试输出栈内的情况
    28         }
    29         return stack.peek();    //程序运行结束后,栈内只剩一个数据,即答案
    30     }
    31     public static String turnvalue(String s){   //中缀变换后缀
    32         Stack<String> stack = new Stack<String>();
    33         StringBuffer sb = new StringBuffer();
    34         int i = 0;
    35         while(i < s.length()){
    36             char c = s.charAt(i);
    37             switch(c){
    38                 case '+':case '-':    //存加减号
    39                     while(!stack.isEmpty() && !stack.peek().equals("("))
    40                         sb.append(stack.pop()+" ");
    41                     stack.push(c + "");i++;
    42                     break;
    43                 case '*':case '/':    //存乘除号
    44                     while(!stack.isEmpty() && (stack.peek().equals("*") || stack.peek().equals("/")))
    45                         sb.append(stack.pop()+" ");
    46                     stack.push(c + "");i++;
    47                     break;
    48                 case '(':
    49                     stack.push(c + "");i++;
    50                     break;
    51                 case ')':
    52                     while(stack.peek() != null && !stack.peek().equals("("))
    53                         sb.append(stack.pop() + " ");
    54                     stack.pop();
    55                     i++;break;
    56                 default:
    57                     if(c == ';'){    //可以存放一些结束符号
    58                         i++;
    59                         break;
    60                     }
    61                     while(i < s.length() && c >='0' && c <= '9'){    //保存数字
    62                         sb.append(c);i++;
    63                         if(i < s.length())
    64                             c = s.charAt(i);
    65                     }
    66                     sb.append(" ");
    67             }
    68         }
    69         while(!stack.isEmpty())
    70             sb.append(stack.pop()+" ");
    71 //      System.out.println(sb);        //检查结果
    72          
    73         return sb.toString();
    74     }
    75     
    76     public static void main(String[] args) {
    77         while(sc.hasNext()){
    78             String s = sc.next();
    79             System.out.println(lastvalue(turnvalue(s)));
    80         }
    81         System.gc();sc.close();
    82     }
    83 }
  • 相关阅读:
    在Ubuntu11.10中安装OpenCV2.3.1的详细步骤
    基于二元语法模型的中文分词
    相似图片搜索的原理
    基于GPU的KMeans聚类算法
    Windows下Eclipse和PyDev搭建完美Python开发环境
    Ubuntu 11.10+win7双系统启动项管理及配置方法
    主题爬虫
    vue定义全局过滤器
    element elimage 放多张图片,显示大图
    element UI的form 禁止浏览器自动填充用户名或密码
  • 原文地址:https://www.cnblogs.com/AardWolf/p/10018680.html
Copyright © 2020-2023  润新知