一、问题描述
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数,在该栈中,调用min、push及pop的时间复杂度都是O(1)
二、问题分析
设计一个辅助栈,以空间换时间,使得一批数据入栈后,可以获得这批数据的最小值。具体规则
见《剑指Offer》P132
三、解题算法
1、栈结构的定义
/************************************************
author:tmw
date:2018-7-1
*************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <stdbool.h>
/**栈数据结构引入**/
#define MAXSIZE 10000
#define OVERFLOW 0
#define error -65530
/**栈的数据结构定义**/
typedef struct Sq_stack
{
int data[MAXSIZE];
int top;
}Sq_stack;
/**栈的创建--初始化**/
void initStack(Sq_stack *S)
{
S = (Sq_stack*)malloc(sizeof(Sq_stack));
if(!S)
exit(OVERFLOW);//栈空间分配失败
S->top = 0; //栈顶元素从0开始算起
}
/**插入栈顶元素e**/
bool Push(Sq_stack *S, int e)
{
/**插入栈顶元素:判断栈是否已满**/
if( S->top == MAXSIZE-1 )
return false;
S->top++;
S->data[S->top] = e;
return true;
}
/**删除栈顶元素,并用节点承接**/
int* Pop(Sq_stack *S)
{
/**删除栈顶元素:判断栈是否为空**/
if(S->top == 0)
return NULL;
int* e = (int*)malloc(sizeof(int));
*e = S->data[S->top];
S->top--;
return e;
}
bool isEmptyStack( Sq_stack *S )
{
return S->top == 0?true:false;
}
2、主算法
/**
* 包含min函数的栈 --- 包含push操作、pop操作、min操作
* @param data_stack -- 数据栈
* @param min_stack -- 辅助栈
*/
void new_push( Sq_stack* data_stack, Sq_stack* min_stack, int value )
{
/**参数验证**/
if( !data_stack || !min_stack ) return;
/**先将data入数据栈**/
Push(data_stack, value);
/**将当前data与辅助栈的top元素比较:
1)如果data<min_stack.top(value),则将data压入min_stack
2)如果data>=min_stack.top(value),则继续将min_stack.top(value)压入min_stack
**/
if( isEmptyStack(min_stack) || min_stack->data[min_stack->top] > value )
Push(min_stack,value);
else
Push(min_stack,min_stack->data[min_stack->top]);
}
void new_pop( Sq_stack* data_stack, Sq_stack* min_stack )
{
if( !isEmptyStack(data_stack) && !isEmptyStack(min_stack) )
{
Pop(data_stack);
Pop(min_stack);
}
else
return;
}
int min_stack( Sq_stack* data_stack, Sq_stack* min_stack )
{
if( !isEmptyStack(data_stack) && !isEmptyStack(min_stack) )
{
int* e = (int*)malloc(sizeof(int));
e = Pop(min_stack);
return *e;
}
return INT_MAX;
}
梦想还是要有的,万一实现了呢~~~~~ヾ(◍°∇°◍)ノ゙~~~~