【练习】设计包含min 函数的栈
定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。
要求函数min、push 以及pop 的时间复杂度都是O(1)。
思路:在栈结点中增加一个指向当前栈最小值的指针。
#include <iostream>
#include <time.h>
using namespace std;
struct StackNode
{
int value;
StackNode *pNext;
StackNode *pMin;
} ;
typedef struct{
StackNode *top; //栈顶指针
}LinkStack;
void InitStack(LinkStack *S)
{
S->top=NULL;
}
void push(LinkStack *S,int element);
int pop(LinkStack *S);
void Min(LinkStack *S);
void printStack(LinkStack *S);
int main()
{
LinkStack *s=new LinkStack();
InitStack(s);
srand((unsigned)time(NULL));
for (int i=0;i<10;i++)
{
push(s,rand()%20);
}
Min(s);
while(s->top!=NULL)
{
pop(s);
Min(s);
}
}
void push(LinkStack *S,int x)
{
if (NULL==S->top)//栈为空时
{
StackNode *p=(StackNode *)malloc(sizeof(StackNode));
p->value=x;
p->pMin=p;
p->pNext=S->top;//将新结点*p插入链栈头部
S->top=p;
}
else
{
StackNode *p=(StackNode *)malloc(sizeof(StackNode));
p->value=x;
p->pMin=p;
/************************************************************************/
/* 使当前结点pMin始终指向当前栈中最小的值 */
if (p->pMin->value<S->top->pMin->value)
{
p->pMin=p;
}
else
{
p->pMin=S->top->pMin;
}
/************************************************************************/
p->pNext=S->top;//将新结点*p插入链栈头部
S->top=p;
}
}
int pop(LinkStack *S)
{
int x;
StackNode *p=S->top;//保存栈顶指针
x=p->value; //保存栈顶结点数据
S->top=p->pNext; //将栈顶结点从链上摘下
free(p);
cout<<"pops "<<x<<endl;
return x;
}
void Min(LinkStack *S)
{
printStack(S);
if (NULL!=S->top)
{
cout<<"current min value is:"<<S->top->pMin->value;
}
else
{
cout<<"stack empty"<<endl;
}
cout<<endl;
cout<<endl;
}
void printStack(LinkStack *S)
{
if (S->top!=NULL)
{
cout<<"current stack is:"<<" ";
StackNode *p=S->top;
while(NULL!=S->top)
{
cout<<S->top->value<<" ";
S->top=S->top->pNext;
}
S->top=p;
cout<<endl;
}
else
{
cout<<"stack empty"<<endl;
}
}
浙公网安备 33010602011771号