逆波兰表达式 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 。