题目:O(1)找堆栈中最小元素
思路:(基本思路:空间换时间)
1.首先先初始化两个堆栈s1,s2 (s1用于正常的堆栈存取,s2用于存放堆栈的最小数据 。
2. 新建函数spush,(如果堆栈s2为空先入栈),如果新入s1的数据要比已存在s2栈顶的
数据要小,则再存入s2。
3.当退出数据时,如果数据和s2栈顶的元素相同,则s2栈顶元素一并弹出。
time:2019/8/21
author by LLQ
代码如下:
#include<stdio.h>
#include<malloc.h>
#include"stack.h"void Spush(stack *s1,stack *s2,int data){
push(s1,data);
if(stackempty(s2))
push(s2,data);
if(data<gettop(s2))
push(s2,data);
}void Spop(stack *s1,stack *s2){
if(gettop(s1)==gettop(s2)){
pop(s1);
pop(s2);
}
}
void min(stack *s2){
printf("当前堆栈最小值:%d\n",gettop(s2));
}
int main(){
//初始化
stack s1,s2;
inistack(&s1);
inistack(&s2);
//入栈
Spush(&s1,&s2,5);
min(&s2);//检测
Spush(&s1,&s2,4);
min(&s2);//检测
//出栈
Spop(&s1,&s2);
min(&s2);//检测
Spush(&s1,&s2,3);
Spush(&s1,&s2,2);
min(&s2);//检测
Spush(&s1,&s2,1);
min(&s2);//检测
}
引用的stack.h包如下:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
//******堆栈数据结构******
typedef struct
{
char *base;
char *top;
int size;
}stack;
//******堆初始化 ******
void inistack(stack *A)
{
A ->base =(char *)malloc(100*sizeof(char));
A ->top = A ->base;
A ->size = 100;
}
//******判断栈是否为空******
bool stackempty(stack *A)
{
if(A->top==A->base)
return true;
else
return false;
}
bool push(stack *A,char x)
{
if(A->top-A->base >=A ->size)
A->base = (char *)realloc(A ->base, (A->size+10)*sizeof(char));
*A->top++=x;
return true;
}
char pop(stack *A)
{
if(A->top==A->base )
return 0;
return(*--A->top);
}
char gettop(stack *A)
{
if(A->top==A->base)
return 0;
return *(A->top-1);
}