1.实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值)的时间复杂度为O(1)
在这个题目中要求要返回一个栈里面的最小值。有两种方法:
1). 用两个栈,一个栈存入栈的数据,另一个栈存对应的最小值,如果入栈的顺序为5,8,1,3,4,则存最小值的那个栈存入的数据应该为5,5,1,1,1。
2). 与上边一样,用两个栈,一个放数据,另一个放最小值,最小值由结构体组成有两部分一个是数据元素data,一个是记录它对应的次数。但是与上边不同的是,在最小值的那个栈里面不会放重复的最小值如果入栈的顺序为5,8,1,3,4,则存最小值的那个栈存入的数据应该为5(2),1(3),在每一次出栈时都会比较最小值的次数和对应栈里面的数据是否对应。
// Min Stack返回栈的最小值
typedef int MSTDataType;
typedef struct MinStack
{
Stack _st;
Stack _minst;
}MinStack;
void MinStackInit(MinStack* pms);//初始化
void MinStackDestory(MinStack* pms);//销毁
void MinStackPush(MinStack* pms, MSTDataType x);//入栈
void MinStackPop(MinStack* pms);//出栈
MSTDataType MinStackMin(MinStack* pms);//获取站的最小值
// Min Stack返回栈的最小值
void MinStackInit(MinStack* pms)
{
assert(pms);
InitStack(&pms->_minst);
InitStack(&pms->_st);
}
void MinStackDestory(MinStack* pms)
{
assert(pms);
DistoryStack(&pms->_minst);
DistoryStack(&pms->_st);
}
void MinStackPush(MinStack* pms, MSTDataType x)
{
assert(pms);
StackPush(&pms->_st, x);
if (StackEmpty(&pms->_minst) == NULL
|| StackTop(&pms->_minst) >= x)//没有计数的情况下要有=
{
StackPush(&pms->_minst, x);
}
}
void MinStackPop(MinStack* pms)
{
assert(pms);
if (StackTop(&pms->_st) == StackTop(&pms->_minst))
{
StackPop(&pms->_minst);
}
StackPop(&pms->_st);
}
MSTDataType MinStackMin(MinStack* pms)
{
assert(pms);
return StackTop(&pms->_minst);
}
2.使用两个栈实现一个队列
3.使用两个队列实现一个栈
4.元素出栈、入栈顺序的合法性。如入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1)
5.一个数组实现两个栈(共享栈)
还没写完。