您的位置:首页 > 其它

【练习】设计包含min 函数的栈

2011-10-17 10:27 323 查看
定义栈的数据结构,要求添加一个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;
}

}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: