'/'是保留浮点数的一般除法。
'//'是除完之后,向下取整。
a = 10
b = 3
print(a/b) # 3.3333333333333335
print(a//b) # 3
当遇到负数时,由于'//'向下取整,导致 -6//132结果不是 0而是-1。
计算逻辑为:
(6/132) = 0.045454545454545456 *(-1) = -0.0454545 ->(向下取整) = -1
因此 如果计算a//b,ab其中一个可能为负数,则应该写成:
int(a/b)
当a/b<0时,向上取整。>0时,向下取整。
涉及到这个问题的题目:
150. 逆波兰表达式求值
【利用栈做】
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
stack = []
for i in range(0,len(tokens)):
if tokens[i] not in ['+','-','*','/']:
stack.append(int(tokens[i]))
else:
b = stack.pop()
a = stack.pop()
if tokens[i] == '+':
stack.append(a+b)
if tokens[i] == '-':
stack.append(a-b)
if tokens[i] == '*':
stack.append(a*b)
if tokens[i] == '/':
stack.append(int(a/b))
#print(stack)
return stack[0]
中缀表达式->逆波兰表达式 。 比如将(a+b) *(c-d) -> ab+cd-*
用栈存符号,用队列 [栈也可以] 进行顺序输出。队列只是存储结构。
规则:
(1)数字直接如队列
(2)查看运算符,如果stack为空,那么运算符直接入栈。
如果碰到了 (,那么直接入栈。
如果碰到了 ),那么就将括号内的运算全部入队列。 【要优先计算括号内的运算】
如果是普通的加减乘除,首先比较栈顶元素和入栈元素,优先级关系。如果栈顶元素优先级大于入栈元素,则将栈顶元素依次弹出,入队列。否则,将入栈元素入栈。(优先级高的优先入队)
(3)最后查看一下,stack中还保留的操作符,依次入队。
即:栈中存储的是,按照优先级由低到高做的。出栈保证运算级,由高到低。
from collections import deque
tokens = [ '(','5','+','4',')','*','(','3','-','1',')']
#tokens = ['0','+','3','+','1']
# ans = ['5','4','+','3','1','-','*']
stack = []
q = deque()
def priority(m,n):
if m in ['*','/'] and n in ['-','+']:
return True
else:
return False
for i in range(0,len(tokens)):
if tokens[i] not in ['(',')','+','-','*','/']:
q.append(int(tokens[i]))
else:
if len(stack) == 0:
stack.append(tokens[i])
continue
elif tokens[i] == '(':stack.append(tokens[i])
elif tokens[i] == ')':
while(True): ## 将括号里面的全部入队,因为肯定要先计算
string = stack.pop()
if string == '(':
break
q.append(string)
else: ## 只剩下加减乘除,先比较优先级,然后按照优先级大小入队
while(len(stack) and priority(stack[-1],tokens[i])): ## 将优先级大于当前元素的全部入队列
q.append(stack.pop())
stack.append(tokens[i]) ## 优先级不大于当前,那么当前操作符入栈,进行下一轮比较
if len(stack): ## 将所有的操作符入队
while(len(stack)): q.append(stack.pop())
print(q)