设计一个有getMin功能的栈

题目:

 实现一个特殊的栈,在实现栈的基本功能基础上,在实现返回栈中最小元素的操作。

代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct stack
{
    int data[100];
    int top;
}Stack,*pStack;

//初始化顺序栈
void InitStack(pStack pstack)
{
    pstack->top = -1;
    return;
}

void push(pStack pstackdata,pStack pstackmin,int val)
{
    int temp;
    if(99 == pstackdata->top)
        return;

    if(pstackmin->top < 0)
    {
        pstackmin->top += 1;
        pstackmin->data[pstackmin->top] = val;
    }
    else if(pstackmin->data[pstackmin->top] > val)
    {
         pstackmin->top += 1;
         pstackmin->data[pstackmin->top] = val;
    }
    else
    {
        temp = pstackmin->data[pstackmin->top];
        pstackmin->top += 1;
        pstackmin->data[pstackmin->top] = temp;
    }
    (pstackdata->top)++;
    pstackdata->data[pstackdata->top] = val;

    return;
}

void pop(pStack pstackdata,pStack pstackmin)
{
    if(pstackdata->top < 0)
    {
        printf("stack empty! pop stack failure\n");
        return;
    }

    printf("pop stack data is %d\n",pstackdata->data[pstackdata->top]);
    (pstackdata->top)--;
    printf("pop stack min is %d\n",pstackmin->data[pstackmin->top]);
    (pstackmin->top)--;
    printf("\n");
}

void Travel(pStack pstack)
{
    int i;
    if(-1==pstack->top)
        printf("Stack empty1\n");
    for(i=0;i<=pstack->top;i++)
        printf("%d",pstack->data[i]);

        printf("\n");
}

int getmin(pStack pstackmin)
{
    return pstackmin->data[pstackmin->top];
}
int main()
{
    Stack stackdata,stackmin;
    InitStack(&stackdata);
    InitStack(&stackmin);

    push(&stackdata,&stackmin,2);
    push(&stackdata,&stackmin,1);
    push(&stackdata,&stackmin,9);
    push(&stackdata,&stackmin,0);
    push(&stackdata,&stackmin,3);
    Travel(&stackdata);
    Travel(&stackmin);

    pop(&stackdata,&stackmin);
    pop(&stackdata,&stackmin);
    pop(&stackdata,&stackmin);
    pop(&stackdata,&stackmin);
    pop(&stackdata,&stackmin);
    pop(&stackdata,&stackmin);

    printf("%d",getmin(&stackmin));
    return 0;
}
其中容易错误的地方是:将pstackmin->data[pstackmin->top]写成pstackmin->data[top]。


push的思想是:stackdata是用来存放数据data,stackmin用来存放从栈底到当前元素的最小值。

1.如果stackmin为空或者data 比stackmin的栈顶元素小,直接将当前的data push到stackmin中。

2.如果data比stackmin的栈顶元素大,那么将stackmin的栈顶元素重复压入。


pop的思想:

与一般的栈的操作基本相同,只是同时将stackdata 与 stackmin的栈顶元素同时弹出。


getmin的思想:

stackmin的栈顶元素永远是stackdata的最小值


另外再加一种c++实现的代码:

class Solution
{
private:
    stack<int> Stackdata;
    stack<int> Stackmin;
public:
    void push(int value)
    {
        Stackdata.push(value);
        if(Stackmin.empty() || (value < Stackmin.top()))
            Stackmin.push(value);
        else
            Stackmin.push(Stackmin.top()); 
    }
    void pop()
    {
        Stackdata.pop();
        Stackmin.pop();
    }
    int top()
    {
        return Stackdata.top();
    }
    int min()
    {
        return Stackmin.top();
    }
};


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值