栈的基本实现: 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;
}