zoukankan      html  css  js  c++  java
  • [LeetCode]Evaluate Reverse Polish Notation(逆波兰式的计算)

    原题链接http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/

    题目描述:

    Evaluate the value of an arithmetic expression in Reverse Polish Notation.

    Valid operators are +-*/. Each operand may be an integer or another expression.

    Some examples:

      ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
      ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6

    题解:

      所谓逆波兰式,即操作符位于操作数之后的表示法,我们常见的表示“三加四”都是表示成“3+4”,这是一种中缀表达式,换成逆波兰式,就应该表示成3 4 +,因此逆波兰式也称“后缀表达式”,具体的关于逆波兰式中缀表达式波兰式(即前缀表达式),参见维基百科。

      很显然,具体操作符最近的两个数便是与这个操作符对应的操作数,用栈来实现是最直观的,这道题一道比较基础的栈的应用题,详情见代码:

     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <string>
     4 #include <vector>
     5 #include <iostream>
     6 #include <stack>
     7 using namespace std;
     8 
     9 int evalRPN(vector<string> &tokens)
    10 {
    11      vector<string>::iterator iter;
    12     stack<int> res;
    13     int a,b;
    14     for (iter=tokens.begin();iter!=tokens.end();iter++)  
    15     {  
    16         if(*iter=="+" || *iter=="-" || *iter=="*" || *iter=="/")
    17         {
    18             b = res.top();
    19             res.pop();
    20             a = res.top();
    21             res.pop();
    22             if(*iter=="+")
    23             {
    24                 res.push(a+b);
    25             }else if(*iter=="-")
    26             {
    27                 res.push(a-b);
    28             }else if(*iter=="*")
    29             {
    30                 res.push(a*b);
    31             }else if(*iter=="/")
    32             {
    33                  res.push(a/b);  
    34             }
    35         }
    36         else
    37         {
    38             res.push(atoi((*iter).data()));
    39         }
    40     }
    41     return res.top();        
    42 }
    43     
    44 int main()
    45 {
    46      freopen("in.in","r",stdin);
    47      freopen("out.out","w",stdout);
    48      
    49      vector<string> tokens;
    50      
    51      string t;
    52     while(!cin.eof())
    53     {
    54         cin>>t;
    55         tokens.push_back(t);
    56     }
    57     
    58     printf("%d
    ",evalRPN(tokens));
    59     return 0;    
    60 }
    View Code
  • 相关阅读:
    让一个不固定高度的div,保持垂直水平居中的方法
    Set、Map、WeakSet 和 WeakMap
    JS 中常用的 Math 方法
    不使用 new,创建一个实例对象
    做一个弹窗
    变量提升
    事件委托实践
    vue组件通信
    新版vue脚手架关闭eslint
    图片懒加载原生js实现
  • 原文地址:https://www.cnblogs.com/codershell/p/3484721.html
Copyright © 2011-2022 走看看