P1-4 设计一个有getMin功能的栈

第一种设计方案

class getMinStack(object):
    def __init__(self):
        self.stackData = []
        self.stackMin = []

    def push(self, newNum):
        self.stackData.append(newNum)
        if not self.stackMin or newNum <= self.stackMin[-1]:
            self.stackMin.append(newNum)

    def pop(self):
        if len(self.stackData) == 0:
            raise Exception("栈为空")
        value = self.stackData.pop()
        if value == self.stackMin[-1]:
            self.stackMin.pop()
        return value

    def getMin(self):
        if len(self.stackMin) == 0:
            raise Exception("栈为空")
        else:
            return self.stackMin[-1]

s = getMinStack()
n = int(input())
for _ in range(n):
    command = input().split()
    if command[0] == 'push':
        s.push(int(command[1]))
    elif command[0] == 'pop':
        s.pop()
    elif command[0] == 'getMin':
        print(s.getMin())

. 运行时间 2415ms
. 占用内存 11612KB

第二种设计方案

class getMinStack(object):
    def __init__(self):
        self.stackData = []
        self.stackMin = []

    def push(self, newNum):
        self.stackData.append(newNum)
        if not self.stackMin or newNum <= self.stackMin[-1]:
            self.stackMin.append(newNum)
        else:
            self.stackMin.append(self.stackMin[-1])

    def pop(self):
        if len(self.stackData) == 0:
            raise Exception("栈为空")
        self.stackMin.pop()
        return self.stackData.pop()

    def getMin(self):
        if len(self.stackMin) == 0:
            raise Exception("栈为空")
        else:
            return self.stackMin[-1]

s = getMinStack()
n = int(input())
for _ in range(n):
    command = input().split()
    if command[0] == 'push':
        s.push(int(command[1]))
    elif command[0] == 'pop':
        s.pop()
    elif command[0] == 'getMin':
        print(s.getMin())

. 运行时间 2237ms
. 占用内存 10696KB


书上说
方案一 入栈时更省空间,出栈时更费时间;
方案二 入栈时更费空间,出栈时更省时间
可我感觉方案二 在运行时间和占用内存上都占优势 仅Python实现如此


排行榜上的优质答案:

import sys

num = int(sys.stdin.readline())  # 使用标准输入 仅读取一行(包括换行符)
stack = []
for i in range(num):
    op = sys.stdin.readline().split()
    if op[0] == 'push':
        stack.append(int(op[1]))
    if op[0] == 'pop':
        stack.pop()
    elif op[0] == 'getMin':
        print(min(stack))