pop push min O(1)

#include <iostream>
#include <memory.h>
using namespace std;

#include<stdio.h>
#define STACK_LEN 7

typedef struct
{
	int data;
	int min;
}stackitem;

typedef struct
{
	stackitem data[STACK_LEN];
	int top;
}stack;

void push(stack *s,int val)
{
	s->data[s->top].data = val;
	if(s->top > 0) 			// 保证栈顶元素中的min始终为当前栈中最小值
	{
		if(val < s->data[s->top-1].min)   // 如果当前push进的元素小于栈中最小元素值
			s->data[s->top].min = val;	  // 把当前元素置为栈中最小元素值
		else
			s->data[s->top].min = s->data[s->top-1].min;
	}
	else		// 否则,不更新
		s->data[s->top].min = val;
	s->top++;
}
int pop(stack *s)
{
	if(s->top-1 >= 0)
		return s->data[--s->top].data;
	else
		return -1;
}
int min(stack*s)
{
	if(s->top-1 >= 0)
		return s->data[s->top-1].min;
	else
		return -1;
}
int main(int argc,char *argv[])
{
	stack s;
	memset(&s,0,sizeof(s));
	push(&s,5);
	push(&s,2);
	push(&s,1);
	push(&s,3);
	push(&s,7);
	push(&s,9);

	printf("pop: %d\n",pop(&s));
	printf("min: %d\n\n",min(&s));

	printf("pop: %d\n",pop(&s));
	printf("min: %d\n\n",min(&s));

	printf("pop: %d\n",pop(&s));
	printf("min: %d\n\n",min(&s));

	printf("pop: %d\n",pop(&s));
	printf("min: %d\n\n",min(&s));

    printf("pop: %d\n",pop(&s));
	printf("min: %d\n\n",min(&s));


	return 0;
}



/*

class C_Overflow {};


template<typename T, int MAX_SIZE = 10>
class C_MinStack
{
public:
    C_MinStack();
    bool IsEmpty() const { return nCurLen == 0; }
    bool IsFull() const  { return nCurLen == MAX_SIZE; }
	int GetSize() const  { return nCurLen; }

	const T& Top() const;
    const T& GetMin() const;
    int Push(const T& val);
    T Pop();

private:
    T arrAllItem[MAX_SIZE];
    int arrMinIndex[MAX_SIZE];
    int nCurLen;
	int nCurMinPos;
};

template<typename T, int SIZE>
C_MinStack<T, SIZE>::C_MinStack():nCurLen(0),nCurMinPos(0) {}

template<typename T, int SIZE>
const T& C_MinStack<T, SIZE>::Top() const
{
    if (IsEmpty())
    {
        throw C_Overflow();
    }

    return arrAllItem[nCurLen - 1];
}

template<typename T, int SIZE>
const T& C_MinStack<T, SIZE>::GetMin() const
{
    if (IsEmpty())
    {
        throw C_Overflow();
    }
    return arrAllItem[arrMinIndex[nCurMinPos - 1]];
}


template<typename T, int SIZE>
int C_MinStack<T,SIZE>::Push(const T& val)
{
    if (IsFull())
    {
        throw C_Overflow();
    }
    if (IsEmpty() || val < GetMin())
    {
        arrMinIndex[nCurMinPos++] = nCurLen;
    }

    arrAllItem[nCurLen++] = val;
	return nCurLen;
}


template<typename T, int SIZE>
T C_MinStack<T, SIZE>::Pop()
{
    if (IsEmpty())
    {
        throw C_Overflow();
    }

    T retVal = arrAllItem[--nCurLen];

    if (nCurLen == arrMinIndex[nCurMinPos-1])
    {
        nCurMinPos--;
    }

    return retVal;
}



int main(int argc, char * argv[])
{
	C_MinStack<int> objStack;

	objStack.Push(2);
	objStack.Push(4);
	objStack.Push(8);
	objStack.Push(6);
	objStack.Push(12);
	objStack.Push(10);
	objStack.Push(15);
	objStack.Push(1);

	cout << "Stack size is: " << objStack.GetSize() << ",Min value is: " << objStack.GetMin() <<  endl;
	objStack.Pop();
	cout << "Stack size is: " << objStack.GetSize() << ",Min value is: " << objStack.GetMin() <<  endl;
	objStack.Pop();
	cout << "Stack size is: " << objStack.GetSize() << ",Min value is: " << objStack.GetMin() <<  endl;
	objStack.Pop();
	cout << "Stack size is: " << objStack.GetSize() << ",Min value is: " << objStack.GetMin() <<  endl;

	return 0;
}
*/


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值