Stack(篇3)设计一个栈能够在O(1)的时间内getMin

47 篇文章 37 订阅
22 篇文章 1 订阅

问题:设计一个数据结构SpecialStack,支持所有的栈操作,如push(),pop(),isEmpty(),isFull()和一个附加的操作getMin()它应该从SpecialStack返回最小元素。SpecialStack的所有这些操作必须是O(1)。要实现SpecialStack,你应该只使用标准的Stack数据结构,没有其他数据结构,如数组,列表,等等。
例:

请考虑以下SpecialStack
16  - > TOP
15
29
19
18

当getMin()被调用时,它应返回15,这是最小值 
元素在当前堆栈。 

如果我们在堆栈上弹出两次,堆栈就变成了
29  - > TOP
19
18

当调用getMin()时,它应该返回18是最小值 
在当前堆栈中。

解决方案:


使用两个堆栈:一个用于存储实际堆栈元素,另一个用作存储最小值的辅助堆栈。这个想法是以push()和pop()操作,使得辅助堆栈的顶部始终是最小的。让我们看看push()和pop()操作如何工作。

Push(int x)//将元素x插入到特殊堆栈
1)将x推送到第一个堆栈(具有实际元素的堆栈)
2)将x与第二个堆栈(辅助堆栈)的顶部元素进行比较。让顶部元素为y。
… ..a)如果x小于y,则将x推到辅助堆栈。
… ..b)如果x大于y,则将y推送到辅助堆栈。

int Pop()//从特殊堆栈中删除一个元素并返回已移除的元素
1)从辅助堆栈弹出顶部元素。
2)从实际堆栈中弹出顶部元素并返回。

步骤1是必要的,以确保辅助堆栈也被更新以用于将来的操作。

int getMin()//从特殊堆栈返回最小元素
1)返回辅助堆栈的顶部元素。

我们可以看到,所有上述操作都是O(1)。
让我们看一个例子。让我们假设两个堆栈最初是空的,18,19,29,15和16被插入到SpecialStack中。

当我们插入18时,两个堆栈都变为以下。
实际堆栈
18 <---顶     
辅助堆栈
18 <----顶

当插入19时,两个堆栈都将更改为以下。
实际堆栈
19 <---顶     
18
辅助堆栈
18 <----顶
18

当插入29时,两个堆栈都将更改为以下。
实际堆栈
29 <---顶     
19
18
辅助堆栈
18 <----顶
18
18

当插入15时,两个堆栈都将更改为以下。
实际堆栈
15 <---顶     
29
19 
18
辅助堆栈
15 <----顶
18
18
18

当插入16时,两个堆栈都更改为以下。
实际堆栈
16 <---顶     
15
29
19 
18
辅助堆栈
15 <----顶
15
18
18
18

代码


import java.util.Stack;


public class StackMin {

    Stack<Integer> stack=new Stack<Integer>();
    Stack<Integer> minStack=new Stack<Integer>();
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int [] pushA={1,2,3,4,5};int [] popA={4,5,3,1,2};
        System.out.println(IsPopOrder(pushA,popA));
    }
    public static  boolean IsPopOrder(int [] pushA,int [] popA) {

        Stack<Integer> stack=new Stack<Integer>();
        int j=0;
        for(int i=0;i<popA.length;i++)
         {  
            if(!stack.isEmpty()&&(stack.peek()==popA[i]))
            {
                stack.pop();
            }
            else {

                while(j<pushA.length&&(pushA[j]!=popA[i]))
                {
                    stack.push(pushA[j]);
                    j++;
                }
                if(j==pushA.length)
                    return false;
                else {
                    j++;
                }
            }           
         }

        return true;
    }
    public void push(int node) {
        stack.push(node);
        if(minStack.isEmpty())
        {
            minStack.push(node);
        }
        else {
            if(node<=minStack.peek())
                minStack.push(node);
        }
    }

    public void pop() {   
        if(minStack.peek()==stack.peek())
            minStack.pop();
        stack.pop(); 
    }

    public int top() {
        return stack.peek();
    }

    public int min() {

        return minStack.peek();

    }
}

getMin()时间复杂度为O(1)空间复杂度为O(n)
下一篇中将实现getMin()时间复杂度为O(1)空间复杂度为也为O(1)。
Stack(篇2)设计一个栈能在O(1)的时间和O(1)的空间getMin()

设计一个最小MinStack类,需要实现的功能是能够在O(1)时间内得到内的最小元素。这通常可以通过维护一个辅助来实现,这个辅助用于存储每个元素对应的最小值。 以下是MinStack类的基本实现方法: ```cpp #include <stack> using namespace std; class MinStack { private: stack<int> dataStack; // 主,存放所有元素 stack<int> minStack; // 辅助,存放当前最小元素 public: /** initialize your data structure here. */ MinStack() { } void push(int x) { dataStack.push(x); // 当辅助为空或者新元素小于等于辅助顶元素时,将新元素压入辅助 if (minStack.empty() || x <= minStack.top()) { minStack.push(x); } } void pop() { if (dataStack.empty()) { return; } int top = dataStack.top(); dataStack.pop(); // 如果弹出的元素是当前最小元素,则辅助也弹出该元素 if (top == minStack.top()) { minStack.pop(); } } int top() { if (dataStack.empty()) { throw out_of_range("Stack is empty"); } return dataStack.top(); } int getMin() { if (minStack.empty()) { throw out_of_range("Stack is empty"); } return minStack.top(); } }; ``` 在这个实现中,每次压入新元素时,我们检查该元素是否小于或等于当前的最小值。如果是,那么我们也将它压入辅助。当弹出元素时,如果弹出的元素正好是当前的最小值,那么我们也将其从辅助中弹出。这样,辅助顶始终保持了当前内的最小值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值