zoukankan      html  css  js  c++  java
  • 数据结构与算法面试题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.
    ");
                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.
    ");
                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)
    ");
        while(~scanf("%d",&e)){
            if(!push(s,e)){
                printf("入栈出问题。
    ");
            }
            printf("minelem:%d
    ",min(s));
        }
        pop(s,e);
        e=min(s);
        printf("栈顶出栈后,栈的最小值为: %d
    ",e);
        return 0;
    }
  • 相关阅读:
    B
    A
    UVA
    马的移动(BFS) 详细注释 一个具有情怀的题目
    JAVA JDK 环境变量配置--简单图解
    linux系统(rpm与deb环境),JAVA JDK的配置
    Jmeter接口测试+压力测试+环境配置+证书导出
    LR访问Https接口
    GitHub linux 提交文件及403错误处理
    random模块写的验证码
  • 原文地址:https://www.cnblogs.com/wabi87547568/p/5259055.html
Copyright © 2011-2022 走看看