V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
fourstring
V2EX  ›  JavaScript

如何优雅地判断输入的两个运算符(仅限于+-*/)的优先级?

  •  
  •   fourstring · 2017-01-22 18:50:49 +08:00 · 3235 次点击
    这是一个创建于 2896 天前的主题,其中的信息可能已经有所发展或是发生改变。

    两个运算符以string形式输入

    13 条回复    2017-01-24 09:41:19 +08:00
    fourstring
        1
    fourstring  
    OP
       2017-01-22 19:08:38 +08:00
    目前想了一个比较蛋疼的实现方式
    https://gist.github.com/fourstring/081234390c4e31ad1fd48ea46d04385d
    Fzzf
        2
    Fzzf  
       2017-01-22 19:23:21 +08:00
    table ,然后直接查表
    linboki
        3
    linboki  
       2017-01-22 19:25:09 +08:00 via Android
    二维数组
    hst001
        4
    hst001  
       2017-01-22 20:05:32 +08:00
    逆波兰表达式,遇到*/就出栈计算
    fourstring
        5
    fourstring  
    OP
       2017-01-22 21:04:47 +08:00   ❤️ 1
    @hst001 我就是在参考 https://zh.wikipedia.org/zh-hans/%E8%B0%83%E5%BA%A6%E5%9C%BA%E7%AE%97%E6%B3%95
    实现中缀式转逆波兰式。。。
    steel1990
        6
    steel1990  
       2017-01-22 21:12:36 +08:00 via Android
    给每个运算符指定一个数字,然后比较数字大小,多简单
    xjp
        7
    xjp  
       2017-01-22 21:17:01 +08:00   ❤️ 1
    直接构造一个 map 记录每个操作符权值 然后相减啊

    ```js
    function compare(op1, op2){
    var weightMap = {"x":1, "/":1, "+":0 ,"-":0 };
    return weightMap [op1] - weightMap [op2];
    }
    ```
    fourstring
        8
    fourstring  
    OP
       2017-01-22 21:18:03 +08:00
    @xjp 是在下输了
    zhidian
        9
    zhidian  
       2017-01-22 21:35:56 +08:00
    写好测试例子,然后 eval 不就可以了。比如:

    > eval("1"+"+"+"2"+"*"+"3")
    7

    说明是 * 优先级高。
    erlanye
        10
    erlanye  
       2017-01-22 21:58:10 +08:00
    if else(或 switch case),没有比这个更优雅的了,上面的回复都是画蛇添足。
    hxsf
        11
    hxsf  
       2017-01-22 22:09:07 +08:00 via iPhone
    在学编译原理?

    定义个 运算优先级表
    noNOno
        12
    noNOno  
       2017-01-23 18:59:43 +08:00
    skyitachi
        13
    skyitachi  
       2017-01-24 09:41:19 +08:00
    @Fzzf 和 @erlanye 都是可以的。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2707 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 12:55 · PVG 20:55 · LAX 04:55 · JFK 07:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.