Evaluate Reverse Polish Notation -- LeetCode

原题链接: http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/
这道题是逆波兰式的求解,不了解逆波兰式的朋友可以参考一下 逆波兰表示法 - wiki 。逆波兰式有个优点就是他不需要括号来表示优先级,直接根据式子本身就可以求解。思路是维护一个运算数栈,读到运算数的时候直接进栈,而每得到一个运算符,就从栈顶取出两个运算数,运算之后将结果做为一个运算数放回栈中,直到式子结束,此时栈中唯一一个元素便是结果。代码如下:
public int evalRPN(String[] tokens) {
    if(tokens==null || tokens.length==0)
        return 0;
    LinkedList<Integer> stack = new LinkedList<Integer>();
    for(int i=0;i<tokens.length;i++)
    {
        if(tokens[i].equals("+"))
        {
            stack.push(stack.pop()+stack.pop());
        }
        else if(tokens[i].equals("-"))
        {
            stack.push(-stack.pop()+stack.pop());
        }
        else if(tokens[i].equals("*"))
        {
            stack.push(stack.pop()*stack.pop());
        }
        else if(tokens[i].equals("/"))
        {
            int num1 = stack.pop();
            int num2 = stack.pop();
            stack.push(num2/num1);
        }
        else
        {
            stack.push(Integer.parseInt(tokens[i]));
        }
    }
    return stack.pop();
}
以上代码中有一个没有周全的地方是没有对逆波兰式错误的情况进行出错处理,其实也不难,就是每次pop操作检查栈空情况,如果栈空,则说明出错。还有就是最后检查一下栈的size,如果不是1也说明运算数多了,返回错误。有兴趣的朋友可以自己补充一下哈。
和这道题类似的,有波兰式求解,中缀表达式求解,这几个其实是表达式的不同表达方式。既然这里出现了逆波兰式,大家还是看看其他两种的求解方法,原理其实近似,都是通过维护栈来实现,网上也有不少材料,这里就不细说了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里是 `evaluate-hand` 函数的实现: ``` (defn evaluate-hand [hand community-cards] (let [all-cards (concat hand community-cards) sorted-cards (sort-by :rank all-cards) flush-suit (->> all-cards (group-by :suit) (sort-by #(count (val %))) last first :suit) straight (some #(apply = (map :rank %)) (partition 5 1 sorted-cards)) straight-flush (and flush-suit straight)] (cond->> {:hand all-cards} straight-flush (assoc :rank :straight-flush) flush-suit (assoc :rank :flush) straight (assoc :rank :straight) :else (let [by-rank (group-by :rank all-cards) counts (map count by-rank) max-count (apply max counts)] (cond->> {:rank :high-card} (= max-count 2) (assoc :rank :pair) (= max-count 3) (assoc :rank :three-of-a-kind) (= max-count 4) (assoc :rank :four-of-a-kind) (and (= max-count 2) (= (count (distinct counts)) 2)) (assoc :rank :two-pair) :else (let [sorted-counts (reverse (sort counts)) kickers (map first (filter #(= (second %) 1) (partition-all 2 sorted-counts)))] (cond (= max-count 1) (assoc :rank :high-card :kickers kickers) (= max-count 3) (assoc :rank :full-house :kickers kickers) :else (assoc :rank :three-of-a-kind :kickers kickers))))))) ``` 该函数接收两个参数,一个是表示手牌的列表 `hand`,一个是表示公共牌的列表 `community-cards`。在该函数中,首先将手牌和公共牌合并成一副牌,并将其按照牌面大小排序。 然后,通过一系列判断,可以判断出当前牌型的大小,并将其保存在一个字典中,其中包括了牌型和可能的“踢牌”(如果有的话)。最终,这个字典会被返回。 这个函数并不是最优的实现方法,但是足以用于简单的德州扑克游戏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值