1、实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值)的时间 复杂度为O(1)
方法1:使用一个栈实现,交叉栈
#pragma once
#include<stdio.h>
#define MAX_VALUE 100
typedef struct MinStack{
int array[MAX_VALUE];
int top;
}MinStack;
//实现一个栈,要求实现Push(入栈)、Pop(出栈)、Min(返回最小值)的时间,复杂度为O(1)
/*两个方法:
1、一个栈,交叉栈;
2、两个栈
*/
void Init(MinStack *pMs)
{
//一个栈
pMs->top = 0;
}
void Push(MinStack *pMs, int data)
{
//一个栈
int min = data;
if (pMs->top != 0 && pMs->array[pMs->top - 1] < min){
min = pMs->array[pMs->top - 1];
}
pMs->array[pMs->top++] = data;//先放普通数据
pMs->array[pMs->top++] = min;//再放当前最小数
}
void Pop(MinStack *pMs)
{
pMs->top -= 2;
}
int Min(MinStack *pMs)
{
return pMs->array[pMs->top - 1];
}
int Top(MinStack *pMs)
{
return pMs->array[pMs->top - 2];
}
void test1()
{
MinStack ms;
Init(&ms);
int arr[] = { 3, 2, 5, 6, 8, 3, 1, 9 };
for (int i = 0; i < sizeof(arr) / sizeof(int); i++){
Push(&ms, arr[i]);
}
printf("%d ", Min(&ms));
Pop(&ms);
printf("%d ", Min(&ms));
Pop(&ms);
printf("%d ", Min(&ms));
}
方法2:使用两个栈
#pragma once
#include<stdio.h>
#define MAX_VALUE 100
//两个栈
typedef struct MinStack{
int array1[MAX_VALUE];
int top1;//普通数据
int array2[MAX_VALUE];
int top2;//最小数据
}MinStack;
//实现一个栈,要求实现Push(入栈)、Pop(出栈)、Min(返回最小值)的时间,复杂度为O(1)
/*两个方法:
1、一个栈,交叉栈;
2、两个栈
*/
void Init(MinStack *pMs)
{
//两个栈
pMs->top1 = pMs->top2 = 0;
}
void Push(MinStack *pMs, int data)
{
//两个栈
/*int min = data;
if (pMs->top2 != 0 && pMs->array2[pMs->top2 - 1] < data) {
min = pMs->array2[pMs->top2 - 1];
}
pMs->array1[pMs->top1++] = data;
pMs->array2[pMs->top2++] = min;*/
//不再每次都入最小栈
pMs->array1[pMs->top1++] = data;
if (pMs->top2 == 0 || data <= pMs->array2[pMs->top2 - 1]) {
pMs->array2[pMs->top2++] = data;
}
}
void Pop(MinStack *pMs)
{
/*pMs->top1--;
pMs->top2--;*/
//不再每次都入最小栈
if (pMs->array1[pMs->top1 - 1] == pMs->array2[pMs->top2 - 1]) {
pMs->top2--;
}
pMs->top1--;
}
int Min(MinStack *pMs)
{
return pMs->array2[pMs->top2 - 1];
}
int Top(MinStack *pMs)
{
return pMs->array1[pMs->top1 - 1];
}
void test2()
{
MinStack ms;
Init(&ms);
int arr[] = { 3, 2, 5, 6, 8, 3, 1, 9 };
for (int i = 0; i < sizeof(arr) / sizeof(int); i++){
Push(&ms, arr[i]);
}
printf("%d ", Min(&ms));
Pop(&ms);
printf("%d ", Min(&ms));
Pop(&ms);
printf("%d ", Min(&ms));
}
所用栈方法可见:
栈操作