逆波兰表达式 Python

趁着今天状态还可以我再试试逆波兰。希望伙伴们持续查看 ShoelessCai.com 我们持续为大家输出,跟上这个时代必须的知识。

 

第一,先看3个案例,规则如下:

1.遇到数字,一律进入堆栈。python 直接可以用 list处理,设置 int 指针。if ( int 指针 < len( list ) ) then list[ 指针 ] = 元素值; else list.append( 元素值 )

2.遇到操作符号,堆栈 pop 2 个数字进行运算,结果再次 push 入栈。

pop: vec_tail = vec_tail-1; val = list[ vec_tail ];

push:

if( vec_tail < len(list) ):

  list[ vec_tail ] = val; vec_tail = vec_tail + 1

else:

  list.append( val ); vec_tail = vec_tail + 1

3.逆波兰是木有 【括号】 的!

 

第二,函数一共 设计了4个。是否为数字?是否为操作符?四则运算结果输出,以及输出逆波兰结果(主函数)。

准备工作

'''------------------------------------------------------------------------------
逆波兰表达式 -- leetCode 2023.10.26

输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

----------------------------------------------------------------------------------'''
import numpy as np
import pandas as pd

 

所涉及的函数

# -- 是否 操作数 / 数字 ?
def is_operand(elem_in):
    elem_in = str(elem_in)
    
    vec_in=["+", "-", "*", "/", "%", "(", ")","="]
    
    out_operand=0
    for i in range(len(vec_in)):
        if ( elem_in == vec_in[i]):
            out_operand=1
            break        
    return out_operand
    
    
    
def is_numeric(elem_in):
    elem_1 = str(elem_in)
    tmp_len = len(elem_1)
    elem_1 = elem_1[tmp_len-1] # -- 只判定个位数
    
    vec_in=["0","1","2","3","4","5","6","7","8","9"]

    out_numeric=0
    for i in range(len(vec_in)):
        if(elem_1 == vec_in[i]):
            out_numeric=1
            break   
    return out_numeric



def four_calculate(n1, n2, operand_in):
    n1=int(n1)
    n2=int(n2)
    
    if (operand_in=="+"):
        rslt = n1+n2
    elif(operand_in=="-"):
        rslt = n1-n2
    elif(operand_in=="*"):
        rslt = n1*n2
    elif(operand_in=="/"):
        rslt = np.floor(n1/n2)
        if(rslt<0):
            rslt=rslt+1
    elif(operand_in=="%"):
        rslt = n1%n2
    else:
        rslt = -9999
    return rslt



# -- 恢复表达式
def cal_rpn(token_in):
    num_rslt=-9999
    vec_operand=[]; o_tail=0
    vec_number=[]; n_tail=0
    
    for i in range(len(token_in)):
        bool_operand=0; bool_numeric=0;
        bool_operand=is_operand(token_in[i])
        
        if (bool_operand==0):
            bool_numeric=is_numeric(token_in[i])
    
        if ( bool_operand==1 and bool_numeric==0 ):
            if(n_tail > 0):
                # -- 显示数字 / 报错a
                n_tail=n_tail-1    
                num_2 = vec_number[n_tail]
                    
                if (n_tail > 0):
                    n_tail=n_tail-1
                    num_1 = vec_number[n_tail]
                else:
                    print("Number Stack Error!")
                    return -9999
                    
                num_rslt=four_calculate(num_1, num_2, token_in[i]) 
                vec_number[n_tail]=num_rslt
                n_tail=n_tail+1
                    
        elif( bool_operand==0 and bool_numeric==1 ):
            if (n_tail<len(vec_number)):
                vec_number[n_tail] = token_in[i]
            else:
                vec_number.append(token_in[i])
            n_tail=n_tail+1                  
    return num_rslt
            

 

看看运行结果吧!

# --- 测试

token_1 = ["2","1","+","3","*"]
token_2 = ["4","13","5","/","+"]
token_3 = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]

tmp=cal_rpn(token_1)
print("RPN result-1: ", tmp)

tmp=cal_rpn(token_2)
print("RPN result-1: ", tmp)

tmp=cal_rpn(token_3)
print("RPN result-1: ", tmp)

 

结果

 

欢迎关注 ShoelessCai.com 。

 

posted on 2023-10-26 22:37  Mira_2019  阅读(31)  评论(0编辑  收藏  举报