21-包含min函数的栈

一、问题描述

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的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;
}



梦想还是要有的,万一实现了呢~~~~~ヾ(◍°∇°◍)ノ゙~~~~

猜你喜欢

转载自blog.csdn.net/qiki_tangmingwei/article/details/80874820