直观上push,pop的复杂度肯定是O(1)..
当然,这里的min操作应该是找出栈中的最小元素,但并不要求将该元素出栈。。。
核心思想是,栈顶元素同时记录着当前栈的最小元素指针
这里涉及到需要证明的一个地方,这也是算法正确性的体现,即无论是出栈还是入栈,这样的栈结构设计都能够保证始终通过栈顶能直接找到最小元素
结构体竟然可以直接assignment,太神奇了,s1=s2;
这个程序有一个建栈的过程,采用shell进行自动化的输入
problem:输入的问题
难度还是不小,细节的东西太多,慢慢来,不要急功近利。。。
push操作:
初始时,栈为空,直接放进去
若栈已满,显然操作失败
否则,比较该元素与当前最小元素,选择较小者的位置作为栈顶元素的min_pointer。
pop操作:
就是普通栈的pop操作,这里就有一个Markov链的问题,即当前最小仅与当前栈有关系,与之前的栈没有必须的联系
核心代码实现:
typedef struct node
{
int num;
struct node *min_pointer;
}eType;
struct stack
{
int top;
eType data[100];
};
int min(struct stack *s)
{
if(!isStackEmpty(s))
return s->data[s->top-1].min_pointer->num;
}
int push(struct stack *s,int n)
{
if(!isStackFull(s))
{
s->data[s->top].num = n;
if(isStackEmpty(s) || (n<min(s)))
{
s->data[s->top].min_pointer = &(s->data[s->top]);
s->top++;
return 0;
}
s->data[s->top].min_pointer = s->data[s->top-1].min_pointer;
s->top++;
return 0;
}
else
return -1;
}
int pop(struct stack *s,int &num)
{
if(!isStackEmpty(s))
num = s->data[--s->top].num;
else
return -1;
}