Cho danh sách ops các thao tác stack: số (push), "POP", "DUP" (nhân đôi đỉnh), "+" (cộng 2 đỉnh), "-" (trừ đỉnh - đỉnh dưới). Trả về phần tử đỉnh cuối cùng, hoặc -1 nếu thao tác không hợp lệ.
Ví dụ: ops=["5","2","POP","DUP","3","+","15","-"] → 7.
Giải thuật (Mô phỏng stack)
- Duyệt từng thao tác:
- Số → push
POP: pop nếu stack không rỗngDUP: pop đỉnhp, pushphai lần+: popa,b, pusha+b-: popa,b, pusha-b- Khác → trả về -1
- Trả về đỉnh stack
Ví dụ triển khai
def solve(ops):
stack = []
for op in ops:
if op.isnumeric():
stack.append(int(op))
elif len(stack) >= 1 and op == "POP":
stack.pop()
elif len(stack) >= 1 and op == "DUP":
p = stack.pop()
stack.append(p)
stack.append(p)
elif len(stack) >= 2 and op == "+":
a = stack.pop()
b = stack.pop()
stack.append(a + b)
elif len(stack) >= 2 and op == "-":
a = stack.pop()
b = stack.pop()
stack.append(a - b)
else:
return -1
return stack.pop() if stack else -1
print(solve(["5", "2", "POP", "DUP", "3", "+", "15", "-"]))
Đầu vào
["5", "2", "POP", "DUP", "3", "+", "15", "-"]
Đầu ra
7