kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

ALDS1_3_A: Stack

appendとpopでやるのは反則としておこう
どこまでならゆるされるだろうか、と考えて配列とスタックポインタで書いてみた

Pythonで「配列」って言うのは変かな
でも気持ちは配列

#! /usr/local/bin/python3
# coding: utf-8

sp = 0
stack = [0] * 100

def stack_push(v):
    global sp, stack
    stack[sp] = v
    sp += 1

def stack_pop():
    global sp, stack
    sp -= 1
    return stack[sp]

def stack_op2(op):
    v2 = stack_pop()
    v1 = stack_pop()
    stack_push(op(v1, v2))

def calc(terms):
    for t in terms:
        if t == "+":
            stack_op2(lambda v1, v2: v1 + v2)
        elif t == "-":
            stack_op2(lambda v1, v2: v1 - v2)
        elif t == "*":
            stack_op2(lambda v1, v2: v1 * v2)
        else:
            stack_push(int(t))
    return(stack_pop())

print(calc(input().split()))

動いたけど、解説と見比べてみたらspが普通と1ずれてるな
普通は指してるところが最新の値か 言われてみるとそうだな
そのかわり0番目は空けておくのか なるほど

def stack_push(v):
    global sp, stack
    sp += 1
    stack[sp] = v

def stack_pop():
    global sp, stack
    sp -= 1
    return stack[sp + 1]

お、しかもエラーチェックやってるな
と思ったら擬似コードのほうだけか

ところで+とか-を関数として使うにはどうしたらいいのかな
lambdaで書いたけど