【資料結構】實現一個棧要求實現Push(出棧)Pop(入棧)Min(返回最小值)的時間 複雜度為O(1)
阿新 • • 發佈:2018-11-25
文章目錄
棧的基本實現: https://blog.csdn.net/weixin_41892460/article/details/82973851
思路
在一個棧裡面封裝兩個棧,一個儲存所有入棧的資料,一個是最小棧儲存每次入棧出棧的最小值,入棧的時候判斷入棧元素與最小棧棧頂元素的大小,如果小於兩個都入棧,如果大於就不在最小棧入棧。
MinStack.h
#ifndef __MINSTACK_H__ #define __MINSTACK_H__ #include <stdio.h> #include <assert.h> #include <stdlib.h> #include <malloc.h> typedef int DataType; typedef struct Stack1 { DataType* a; size_t top1; size_t capacity1; }Stack1; typedef struct Stack2 { DataType* a; size_t top2; size_t capacity2; }Stack2; typedef struct Stack { Stack1 s1; Stack2 s2; }Stack; void StackInit(Stack* s); void StackPush(Stack* s, DataType x); void StackPop(Stack* s); size_t StackSize(Stack* s); int StackEmpty(Stack* s); void StackDestory(Stack* s); int StackMindata(Stack* s); void text(); #endif
MinStack.c
#include "MinStack.H" void StackInit(Stack* s) { assert(s); s->s1.a = (DataType*)malloc(sizeof(DataType)); s->s1.top1 = 0; s->s1.capacity1 = 10; s->s2.a = (DataType*)malloc(sizeof(DataType)); s->s2.top2 = 0; s->s2.capacity2 = 10; } void StackDestory(Stack* s) { assert(s); s->s1.a = NULL; s->s1.top1 = 0; s->s1.capacity1 = 0; free(s->s1.a); s->s1.a = NULL; s->s1.top1 = 0; s->s1.capacity1 = 0; free(s->s1.a); s = NULL; } void StackPush(Stack* s, DataType x) { assert(s); //棧滿,開闢新的空間 DataType* cur1; DataType* cur2; if (s->s1.top1 == s->s1.capacity1&&s->s2.top2 == s->s2.capacity2) { cur1 = (DataType*)realloc(s->s1.a, sizeof(s->s1.capacity1) * 2); if (cur1 != NULL) { s->s1.a = cur1; } s->s1.capacity1 *= 2; cur2 = (DataType*)realloc(s->s1.a, sizeof(s->s2.capacity2) * 2); if (cur2 != NULL) { s->s2.a = cur2; } s->s2.capacity2 *= 2; } //有空間 if (s->s1.top1 == 0 && s->s2.top2 == 0) { //值都入倆個棧 s->s1.a[s->s1.top1++] = x; s->s2.a[s->s2.top2++] = x; } //如果s2的棧頂元素小於所要入的值則只入到s1 else if (s->s2.a[s->s2.top2 - 1] >= x) { s->s1.a[s->s1.top1++] = x; s->s2.a[s->s2.top2++] = x; } else { s->s1.a[s->s1.top1++] = x; } //assert(s); //StackPush(&s->s1, x); //if (StackEmpty(&s->s2 == 0) // || s->s2.a[s->s2.top2 - 1] >= x) //{ // StackPush(&s->s1, x); //} } void StackPop(Stack* s) { assert(s); assert(s->s2.top2 > 0); if (s->s1.top1 == 0 && s->s2.top2 == 0) { printf("棧已空!!!"); return; } if (s->s1.a[s->s1.top1] == s->s2.a[s->s2.top2 - 1]) { s->s2.top2--; s->s1.top1--; } else { s->s2.top2--; } } int StackMindata(Stack* s) { assert(s); if (s->s1.top1 == 0 && s->s2.top2 == 0) { printf("棧已空!!!"); return 0; } return (s->s2.a[s->s2.top2 - 1]); } size_t StackSize(Stack* s) { assert(s); assert(s->s1.top1); assert(s->s2.top2); s->s1.top1++; s->s2.top2++; return s->s1.top1 + s->s2.top2; } int StackEmpty(Stack* s) { assert(s); return (s->s1.top1) || (s->s2.top2) == 0 ? 0 : 1; }
Test.c
#include "MinStack.H" void text() { Stack s; StackInit(&s); StackPush(&s, 6); StackPush(&s, 5); StackPush(&s, 6); StackPush(&s, 5); StackPush(&s, 4); StackPush(&s, 6); StackPush(&s, 5); StackPush(&s, 4); StackPush(&s, 0); printf("Mindata: %d\n", StackMindata(&s)); } int main() { text(); system("pause"); return 0; }