劍指Offer的學習筆記(C#篇)-- 包含min函數的棧

題目描述

定義棧的數據結構,請在該類型中實現一個可以獲得棧中所含最小元素的min函數(時間複雜度應爲O(1))。

一 . 題目該怎麼想

        1 . 定義棧的數據結構;實現Push、Pop、Top、Min方法;時間複雜度爲O(1) 。node

         思路:定義兩個棧。一個存儲棧,一個輔助棧。數據結構

          Push方法:1. 存儲棧 -- 正常進棧便可。函數

                             2. 輔助棧 -- 先定義一個數(隨意,目的是讓第一個進棧的數進輔助棧),而後將這個數與以後進棧的數進行比較,當在這以後進棧的數小於這個數的時候,就把他存在輔助棧,若大於等於,則忽略,直接不執行。spa

           Pop方法:1 . 存儲棧 -- 正常出棧便可。code

                            2 . 輔助棧 -- 若是存儲棧出棧的這個數等於輔助棧將要出棧的數,那麼輔助棧出棧,負責不搭理他,也不要出。blog

          Top方法:只需 return stack1.Peek(); 其中stack1表示的是存儲棧,這裏普及一下(Stack.peek()和Stack.pop()的相同點是 獲取棧頂的值,不一樣點 則是 Stack.peek()只是獲取棧頂的值,而Stack.pop()是獲取棧頂的值而後刪除。it

          Min方法:在第二部Pop的時候來一手這個 Min = minstack2.Peek(); ,很穩,其中 minstack2表示的是輔助棧。io

          來,爲了更好的理解,看圖咯!!class

二 . 代碼實現

using System.Collections.Generic;
//using泛型集合類List、DIctionary、Queue、Stack、SortedList,若不引用不可運行
class Solution
{
    //定義兩個棧,一個存儲棧,一個輔助棧
    Stack<int> stack1 = new Stack<int>();
    Stack<int> minstack2 = new Stack<int>();
    //先定義一個最小值Min,其中他的初始狀態是int類型中的最大值(單純的湊數而已,可有可無)
    int Min=int.MaxValue;
    //push方法,首先是存儲棧進棧,而後一個if函數,若進棧的這個數比輔助棧裏面最小的數還小,則輔助棧也執行進棧
    public void push(int node)
    {
        stack1.Push(node);
        if(node<Min)
        {
            Min=node;
            minstack2.Push(node);
        }
    }
    //pop方法,若存儲棧pop出的數等於最小值,輔助棧執行POP方法
    public void pop()
    {
        if(stack1.Pop()== Min)
        {
            minstack2.Pop();
            Min = minstack2.Peek();
        }
    }
    //Stack.peek()和Stack.pop()的相同點是 獲取棧頂的值,
    //不一樣點 則是 Stack.peek()只是獲取棧頂的值,而Stack.pop()是獲取棧頂的值而後刪除。
    public int top()
    {
        return stack1.Peek();
    }
     //不解釋
    public int min()
    {
        return Min;
    }
}
相關文章
相關標籤/搜索