双语解题系列【01】设计一个有GetMIN功能的栈 --C++实现与python实现

设计一个有GetMIN功能的栈(1星)

解题思路:

设计1个栈,但是要带有取最小值的栈,有取最小也就是有比大小,那肯定需要参照,所以除了需要一个带取最小的目标栈,还有个普通的中间栈。

代码思路:

假设当前数据newNum,将其押入stackData.

然后判断stackMin是否为空,如果是空,则newNum也押入stackMin;如果不是空,则比较newNum和stackMin的大小,取较小押入stackMin。

弹出数据的规则:

在stackData中弹出数据,弹出的数据记为value;弹出stackMin中的栈顶;返回value。

python版

class Stack1(object):
    def __init__(self):
        self.stackData=[]
        self.stackMin=[]
    def push(self,num):
        self.stackData.append(num)
        if len(self.stackMin)==0 or num<=self.getMin():
            self.stackMin.append(num)
        else:
            self.stackMin.append(self.getMin())
    def pop(self):
        if len(self.stackData)==0:
            raise Exception("stack is empty")
        self.stackMin.pop()
        return self.stackData.pop()
    def getMin(self):
        if len(self.stackMin)==0:
            raise Exception("stack is empty")
        return self.stackMin[-1]
class Stack2(object):
    def __init__(self):
        self.stackData=[]
        self.stackMin=[]
    def push(self,num):
        self.stackData.append(num)
        if len(self.stackMin)==0 or num<=self.getMin():
            self.stackMin.append(num)
    def pop(self):
        if len(self.stackData)==0:
            raise Exception("stack is empty")
        value=self.stackData.pop()
        if self.getMin()==value:
            self.stackMin.pop()
        return value
    def getMin(self):
        if len(self.stackMin)==0:
            raise Exception("stack is empty")
        return self.stackMin[-1]

C++ 版实现

class MyStack
{
private:
    stack* stackData; //数据栈
    stack* stackMin;  //最小栈
public:
    MyStack()
    {
        stackData = new stack;
        stackMin = new stack;
    }
    ~MyStack()
    {
        delete stackData;
        delete stackMin;
    }
    //压栈
    bool push(int newNum)
    {
        //最小栈若为空,压入新元素,否则比较新元素和最小值大小,小于等于最小值时压栈
        if (stackMin->empty()) 
        {
            stackMin->push(newNum);
        }    
        else if (newNum <= getMin())
        {
            stackMin->push(newNum);
        }

        stackData->push(newNum);
        return true;
    }
    //出栈,返回stackData栈顶元素
    int pop()
    {
        if (stackData->empty())
            throw runtime_error ("stackData is empty");

        int value = stackData->top();
        stackData->pop();
        //数据栈中元素删除时,若此数据存在于最小栈中,最小栈栈顶元素出栈
        if (value == getMin())
        {
            stackMin->pop();
        }
        return value;
    }
    //获取栈中最小值
    int getMin()
    {
        if (stackMin->empty())
            throw runtime_error("stackMin is empty");
        return stackMin->top();
    }
};

写字不易,您的3连是我最想留住的小幸运!
############################我是分割线######################################
双语解题系列【01】设计一个有GetMIN功能的栈 --C++实现与python实现_第1张图片

你可能感兴趣的:(+C++双语版,数据结构,算法,栈,python,c++,leetcode)