51 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
operators = {
 | 
						|
    '*': 1,
 | 
						|
    '+': 0,
 | 
						|
}
 | 
						|
 | 
						|
def tokenize(xs):
 | 
						|
    result = []
 | 
						|
    i = 0
 | 
						|
    while i < len(xs):
 | 
						|
        current = xs[i]
 | 
						|
        if current in operators.keys():
 | 
						|
            result.append(current)
 | 
						|
            i += 1
 | 
						|
            continue
 | 
						|
        else:
 | 
						|
            i += 1
 | 
						|
            while i < len(xs) and xs[i] in {str(n) for n in range(10)}:
 | 
						|
                current += xs[i]
 | 
						|
                i += 1
 | 
						|
            result.append(int(current))
 | 
						|
    return result
 | 
						|
 | 
						|
def postfix(xs):
 | 
						|
    result = []
 | 
						|
    s = []
 | 
						|
    for x in xs:
 | 
						|
        if x in operators.keys():
 | 
						|
            while s and operators[s[-1]] >= operators[x]:
 | 
						|
                result.append(s.pop())
 | 
						|
            s.append(x)
 | 
						|
        else:
 | 
						|
            result.append(x)
 | 
						|
    while s:
 | 
						|
        result.append(s.pop())
 | 
						|
    return result
 | 
						|
 | 
						|
def evaluate(xs):
 | 
						|
    s = []
 | 
						|
    for x in xs:
 | 
						|
        print(s, x)
 | 
						|
        if x == '*':
 | 
						|
            s.append(s.pop() * s.pop())
 | 
						|
        elif x == '+':
 | 
						|
            s.append(s.pop() + s.pop())
 | 
						|
        else:
 | 
						|
            s.append(x)
 | 
						|
        print(s)
 | 
						|
    return s[-1]
 | 
						|
 | 
						|
 | 
						|
print(evaluate(postfix(tokenize("12+3*10"))))
 |