1. 程式人生 > >[leetcode]Min Stack (獲取棧的最小元素C語言實現)

[leetcode]Min Stack (獲取棧的最小元素C語言實現)

Min Stack
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.

push(x) – Push element x onto stack.
pop() – Removes the element on top of the stack.
top() – Get the top element.
getMin() – Retrieve the minimum element in the stack.

題目意思:設計一個棧,讓它能實現push,pop,top,並同時能獲取棧元素的最小值。
push(x)–壓棧
pop()–出棧
top()–獲取棧頂元素
getMin()–獲取棧的最小元素

解題思路:要求壓棧、出棧、尋找棧中最小值的時間複雜度都是O(1),所以按照網友部落格給的資料需要申請兩個棧,一個用於正常的儲存資料(data陣列),另一個用於儲存最小值(min陣列),並設定相應兩個棧的棧頂指標,對於壓棧和出棧的時間複雜度當然是O(1),但難點在getMin獲取棧的最小值,若使用一般的求陣列的最小值演算法,其時間複雜度為O(n),所以不符合題意對於min陣列用於儲存data棧的最小值,當push資料進data陣列時同時和min陣列的棧頂元素進行比較,若大於min的棧頂元素則不壓入min陣列內,否則同時壓入min陣列中,這樣getMin()就直接從min陣列中的棧頂讀取,時間複雜度為O(1)。
難點:不容易想到用兩個棧來儲存資料,一個用於正常的儲存棧資料,,另一個用於儲存前一個棧的最小值。
實現C程式碼:

/**
 * 解題思路:要求壓棧、出棧、尋找棧中最小值的時間複雜度都是O(1),所以按照網友部落格給的資料
 * 需要申請兩個棧,一個用於正常的儲存資料(data陣列),另一個用於儲存最小值(min陣列),
 * 並設定相應兩個棧的棧頂指標,對於壓棧和出棧的時間複雜度當然是O(1),但難點在getMin獲取棧的最小值,
 * 若使用一般的求陣列的最小值演算法,其時間複雜度為O(n),所以不符合題意
 * 對於min陣列用於儲存data棧的最小值,當push資料進data陣列時同時和min陣列的棧頂元素進行比較,若
 * 大於min的棧頂元素則不壓入min陣列內,否則同時壓入min陣列中
 * 這樣getMin()就直接從min陣列中的棧頂讀取,時間複雜度為O(1)。
 * 
 */
typedef struct { int data[20000];//初始化時給定棧大小為20000 int min[20000];//同時讓min的大小也為20000,防止壓入data的全是一樣的資料 int top;//data的棧頂指標 int mintop;//min的棧頂指標 } MinStack; void minStackCreate(MinStack *stack, int maxSize) {//棧的大小初始化已經在建立棧的時候給定了,本人設定的是20000大小,不用管maxSize stack->top = -1; stack->mintop = -1; memset(stack->data, 0, 20000); memset(stack->min, 0 ,20000); } void minStackPush(MinStack *stack, int element) {//壓入data時同時把最小值也壓入min陣列 if(stack->top < 19999){ stack->top++; stack->data[stack->top] = element; if(stack->mintop == -1 || element <= stack->min[stack->mintop]){ stack->mintop++; stack->min[stack->mintop] = element; } }else{ return; } } void minStackPop(MinStack *stack) {//刪除data棧頂元素時,同時比較data棧頂元素值是否等於min陣列的棧頂元素值,若相等則min陣列出棧 int temp, temp1; if(stack->top == -1){ return; } temp = stack->data[stack->top]; stack->top--; if(temp == stack->min[stack->mintop]){ temp1 = stack->min[stack->mintop]; stack->mintop--; } } int minStackTop(MinStack *stack) { return stack->data[stack->top]; } int minStackGetMin(MinStack *stack) {//這裡直接獲取min陣列的棧頂元素,也就是data陣列的最小值 return stack->min[stack->mintop]; } void minStackDestroy(MinStack *stack) {//不用管這個函式 }