• 最小栈实现支持最小值的返回


        有时候我们在使用堆栈时需要增加一些额外功能,例如返回栈中的最小值。本例实现了这样的操作,而且Push,Pop和返回最小值都能在常量时间内完成。

        下满是C++实现:

    // 设计一个堆栈, 堆栈除了支持push, pop 以外,还支持min,
    // 并且他们的时间复杂度都是O(1)

    #ifndef MIN_STACK_H
    #define MIN_STACK_H

    #include
    <cstdlib>

    template
    <typename T>
    class MinStack
    {
    public:
    void Push(T value);
    T Pop();
    T Min() {
    return this->_min->value; }
    bool Empty() { return _head == NULL; }

    MinStack() : _head(NULL), _min(NULL) {}
    private:
    struct Entry
    {
    Entry() : lastMin(NULL), nextEntry(NULL)
    { }
    T value;
    Entry
    * lastMin;
    Entry
    * nextEntry;
    };

    Entry
    * _head;
    Entry
    * _min;
    };

    template
    <typename T>
    void MinStack<T>::Push(T value)
    {
    Entry
    * pEntry = new Entry();
    pEntry
    ->value = value;
    pEntry
    ->nextEntry = this->_head;
    this->_head = pEntry;
    if(this->_min == NULL)
    this->_min = pEntry;
    else if(pEntry->value < this->_min->value)
    {
    pEntry
    ->lastMin = this->_min;
    this->_min = pEntry;
    }
    }

    template
    <typename T>
    T MinStack
    <T>::Pop()
    {
    T val
    = this->_head->value;
    if(this->_head->lastMin != NULL)
    this->_min = this->_head->lastMin;
    Entry
    * head = this->_head;
    this->_head = head->nextEntry;
    delete head;
    return val;
    }

    #endif
     

        下面是测试代码:

    代码
    #include "MinStack.h"

    #include
    <iostream>
    using namespace std;

    void test(int vals[], int len)
    {
    MinStack
    <int> stack;
    for(int i = 0; i < len; i++)
    stack.Push(vals[i]);

    while(!stack.Empty())
    {
    cout
    << "min:" << stack.Min() << endl;
    cout
    << "pop:" << stack.Pop() << endl;
    }
    }

    int main()
    {
    int arr1[] = {6, 3, 4, 7};
    test(arr1,
    4);
    cout
    << endl;
    int arr2[] = { 1, 2, 3, 4 };
    test(arr2,
    4);
    cout
    << endl;
    int arr3[] = { 4, 3, 2, 1 };
    test(arr3,
    4);
    }
  • 相关阅读:
    iOS 索引列 使用详解
    iOS 搜索条使用详解
    iOS 百度地图使用详解
    在iOS中使用ZBar扫描二维码和条形码
    自学html-five(锚点、伪类、字符实体)
    自学html-four(css初始化及html语义标签 -> h标签 p标签 img标签 有序列表 无序列表 表格 超链接)
    自学html--htree(CSS)
    自学html--two(盒模型)
    自学html--one(div布局)
    常用控件补充(UIDatePicker、UIWebView)
  • 原文地址:https://www.cnblogs.com/alala666888/p/1903775.html
Copyright © 2020-2023  润新知