zoukankan      html  css  js  c++  java
  • Evaluate Reverse Polish Notation (STRINGTYPE CONVERTION)

    Question

    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

    1ST TRY

    class Solution {
    public:
        int evalRPN(vector<string> &tokens) {
            int operant1;
            int operant2;
            string str;
            int ret;
            bool firstOp = false;
            
            for(int i = 0; i < tokens.size(); i++)
            {
                str = tokens[i];
                if(!firstOp)
                {
                    operant1 = getInt(str);;
                    firstOp = true;
                }
                else if(str == "+")
                {
                    ret = operant1 + operant2;
                }
                else if(str == "-")
                {
                    ret = operant1 - operant2;
                }
                else if(str == "*")
                {
                    ret = operant1 * operant2;
                }
                else if(str == "/")
                {
                    ret = operant1 / operant2;
                }
                else
                {
                    operant2 = getInt(str);
                    firstOp = false;
                }
            }
            
            return ret;
        }
        int getInt(string str)
        {
            int ret = 0;
            for(int i = 0; i < str.length(); i++)
            {
                ret = ret*10 + str[i];
            }
            return ret;
        }
    };

    2ND TRY

    考虑只有一个操作数的情况

    class Solution {
    public:
        int evalRPN(vector<string> &tokens) {
            int operant1;
            int operant2;
            string str;
            int ret;
            bool firstOp = false;
            
            for(int i = 0; i < tokens.size(); i++)
            {
                str = tokens[i];
                if(!firstOp)
                {
                    operant1 = getInt(str);
                    firstOp = true;
                }
                else if(str == "+")
                {
                    operant1 += operant2;
                }
                else if(str == "-")
                {
                    operant1 -= operant2;
                }
                else if(str == "*")
                {
                    operant1 *= operant2;
                }
                else if(str == "/")
                {
                    operant1 /= operant2;
                }
                else
                {
                    operant2 = getInt(str);
                }
            }
            return operant1;
        }
        
        int getInt(string str)
        {
            int ret = 0;
            for(int i = 0; i < str.length(); i++)
            {
                ret = ret*10 + (str[i]-'0');
            }
            return ret;
        }
    };

    Result: Wrong

    Input: ["3","-4","+"]
    Output: -23
    Expected: -1

    3RD TRY

    考虑负数的情况

    class Solution {
    public:
        int evalRPN(vector<string> &tokens) {
            int operant1;
            int operant2;
            int ret;
            string str;
            stack<int> operantStack;
            
            for(int i = 0; i < tokens.size(); i++)
            {
                str = tokens[i];
                if(str == "+")
                {
                    operant2 = operantStack.top();
                    operantStack.pop();
                    operant1 = operantStack.top();
                    operantStack.pop();
                    operantStack.push(operant1 + operant2);
                }
                else if(str == "-")
                {
                    operant2 = operantStack.top();
                    operantStack.pop();
                    operant1 = operantStack.top();
                    operantStack.pop();
                    operantStack.push(operant1 - operant2);
                }
                else if(str == "*")
                {
                    operant2 = operantStack.top();
                    operantStack.pop();
                    operant1 = operantStack.top();
                    operantStack.pop();
                    operantStack.push(operant1 * operant2);
                }
                else if(str == "/")
                {
                    operant2 = operantStack.top();
                    operantStack.pop();
                    operant1 = operantStack.top();
                    operantStack.pop();
                    operantStack.push(operant1 / operant2);
                }
                else
                {
                    operantStack.push(getInt(str));
                }
            }
            return operantStack.top();
        }
        
        int getInt(string str)
        {
            int ret = 0;
            bool negFlag = false;
            for(int i = 0; i < str.length(); i++)
            {
                if(str[i]=='-') negFlag = true;
                else if(negFlag)
                {
                    ret = ret*10 - (str[i]-'0');
                }
                else
                {
                    ret = ret*10 + (str[i]-'0');
                }
            }
            return ret;
        }
    };

    Result: Accepted

    4TH TRY

    使用内置函数atoi将string转换成int

    class Solution {
    public:
        int evalRPN(vector< string > &tokens) {
            stack< int > operandStack;
            int operand1;
            int operand2;
            for(int i = 0; i < tokens.size(); i++){
                if(tokens[i]=="+"){
                    operand1 = operandStack.top();
                    operandStack.pop();
                    operand2 = operandStack.top();
                    operandStack.pop();
                    operand2 += operand1;
                    operandStack.push(operand2);
                }
                else if(tokens[i]=="-"){
                    operand1 = operandStack.top();
                    operandStack.pop();
                    operand2 = operandStack.top();
                    operandStack.pop();
                    operand2 -= operand1;
                    operandStack.push(operand2);
                }
                else if(tokens[i]=="*"){
                    operand1 = operandStack.top();
                    operandStack.pop();
                    operand2 = operandStack.top();
                    operandStack.pop();
                    operand2 *= operand1;
                    operandStack.push(operand2);
                }
                else if(tokens[i]=="/"){
                    operand1 = operandStack.top();
                    operandStack.pop();
                    operand2 = operandStack.top();
                    operandStack.pop();
                    operand2 /= operand1;
                    operandStack.push(operand2);
                }
                else{
                    operand1 = atoi(tokens[i].c_str());
                    operandStack.push(operand1);
                }
            }
            return operandStack.top();
        }
    };

    Result: Accepted

  • 相关阅读:
    CLR via C#
    一些写英文简历的词汇
    组合与组合数
    A lowlevel Look at the ASP.NET Architecture
    \r与\n的区别,\r\n与\n或\r的区别(C语言/C#)
    Canvas lineWidth 属性 【每日一段代码18】
    程序员三大世界观 如何看待HTML5
    Canvas运用样式与颜色fillStyle【每日一段代码15】
    Canvas绘制路径:贝塞尔曲线【每日一段代码12】
    Canvas绘制弧形【每日一段代码10】
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/4168335.html
Copyright © 2011-2022 走看看