69,371
社区成员
发帖
与我相关
我的任务
分享
}/*题目描述:设计一栈结构,能求当前栈的最小元素和进出栈操作,时间复杂度要求均为O(1)
算法思路:可以在栈内加上辅助存储,用来存储当前的最小元素。进栈操作时,把该元素与当前栈最小元素
相比较,小于或等于时,该元素也压进辅助存储里,同时相应栈顶指针+1(没有最小只有更小),出栈时,也与当前栈最小元素比较,相等时
此元素也要在辅助存储里出栈,相应指针-1.算法思路来源 CSDN 2011-10-18上午*/
#include<stdio.h>
#include<malloc.h>
struct _stack
{
int top;
int top_min;
int *num ;
int *num_min ;
int size;
}; //定义栈的结构
typedef _stack stack;
//栈的初始化
void initstack(stack *s)
{
if(s ==NULL)
return ;
scanf("%d",&(s->size)); //确定栈容量大小
s->num=(int *)malloc(sizeof(int)*s->size);
s->num_min=(int *)malloc(sizeof(int)*s->size);
s->top=s->top_min=-1;//空栈时,栈顶指针指向栈底-1
}
//进栈操作
void push(stack *s,int e)
{
if(s->top+1>=s->size)
{ printf("stack full");
return;
}
if(s->top==-1)
s->num[++s->top=s->num_min[++s->top_min]=e;
else
{
if(e<=s->num_min[s->top_min])
s->num[++s->top]=s->num_min[++s->top_min]=e; //有更小元素要进栈时,把它也存进辅存
else
s->num[++s->top]=e;
}
}
//出栈操作,返回栈顶元素
int pop(stack *s)
{
if(s->top==-1)
{
printf("empty stack");
return 0;
}
else
{
int data=s->num[s->top--];
if(data==s->num_min[s->top_min])//栈顶元素同时也是最小时,把它从辅存拿出
s->top_min--;
return data;
}
}
void main()
{
int choose,out;
stack* s;
s=(stack *)malloc(sizeof(stack));
initstack(s);
do{
scanf("%d",&choose); //偶数时进栈,反之出栈
if(choose%2==0)
{ push(s,choose);
printf("curren min %d\n ",s->num_min[s->top_min]);
}
else
{
out=pop(s);
if(out!=0) printf("pop elem is %d ",out);
if(s->top_min==-1)
printf("current stack is empty,no min elem");
else
printf("curren min %d\n ",s->num_min[s->top_min]);
}
}while(choose!=0);
}