数据结构与算法面试题80道(二)

2.设计包含min函数的栈。

定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。

要求函数minpush以及pop的时间复杂度都是O(1)

 

思路:push时候 如果 v_push >= min, v_push 直接入栈, 如果 v_push < min, 那么入栈的是 (v_push <<1)- min, 然后 min = v_push. 出栈时, 如果栈顶的top >= min 直接出,如果 top < min 则出现异常,将min作为pop的返回值,另外需要还原前一个最小值,方法是 min = (min<<1) - top。代码很简单,就不写注释了。

 

#include<cstdio>
#include<iostream>
#include<malloc.h>
using namespace std;
typedef int ElemType;
typedef int Status;
typedef struct node{
    int m_value;
    struct node* next;
}Node;

typedef struct {
    ElemType min_elem;//min element
    unsigned int stacksize;//stack size
    Node *top;
}MinStack;

//stack has empty?
bool stackEmpty(MinStack s){
    return s.top==NULL;
}

//initialize stack
void InitStack(MinStack & s){
    s.top= NULL;
    s.stacksize=0;
}

bool push(MinStack &s,ElemType e){
    if(stackEmpty(s)){
        s.top=(Node*)malloc(sizeof(Node));
        if(!s.top){
            printf("malloc error.\n");
            return false;
        }
        s.top->m_value= e;
        s.top->next=NULL;
        s.stacksize=1;
        s.min_elem=e;
    }else{

        Node* pNode=(Node*)malloc(sizeof(Node));
        if(!pNode){
            printf("malloc error.\n");
            return false;
        }
        cout<<e<<endl;
        if(e>=s.min_elem) pNode->m_value=e;
        else {
            pNode->m_value=(e<<1)-s.min_elem;
            s.min_elem=e;
        }
        pNode->next=NULL;
        pNode->next=s.top;
        s.top=pNode;
        s.stacksize++;
    }
    return true;
}

Status pop(MinStack& s,ElemType &e){
    if(!stackEmpty(s)){
        Node* pNode = s.top;
        if(s.min_elem<s.top->m_value) e=s.top->m_value;
        else e=(s.min_elem<<1)-s.top->m_value;
            free(pNode);
        return e;
    }
    cout<<"栈为空"<<endl;
    return -1;
}

Status getTop(MinStack s,ElemType &e){
    if(!stackEmpty(s)){
        if(s.min_elem<s.top->m_value) e=s.top->m_value;
        else e=(s.min_elem<<1)-s.top->m_value;
        return e;
    }
    cout<<"栈为空"<<endl;
    return -1;
}

Status min(MinStack s){
    ElemType e;
    if(!stackEmpty(s)){
        e=s.min_elem;
        return e;
    }
    cout<<"栈为空"<<endl;
    return -1;
}

int main(){
    ElemType e;
    MinStack s;
    InitStack(s);
    printf("请输入入栈的数字(0 to quit)\n");
    while(~scanf("%d",&e)){
        if(!push(s,e)){
            printf("入栈出问题。\n");
        }
        printf("minelem:%d\n",min(s));
    }
    pop(s,e);
    e=min(s);
    printf("栈顶出栈后,栈的最小值为: %d\n",e);
    return 0;
}

 

posted @ 2016-03-09 17:46  dreamOwn  阅读(501)  评论(0编辑  收藏  举报