C语言栈的简易实现,包含O(1)时间复杂度的min方法


#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
//定义栈的初始分配空间
#define STACK_INIT_SIZE 100
//栈的分配增量
#define STACKINCRENMENT 10

typedef struct
{
char *top;//栈顶
char *base;//栈底
char min;
int stacksize;//当前栈的大小
}stack;

//栈的初始化
stack *initStack(stack *s)
{
s->base=(char*)malloc(STACK_INIT_SIZE *sizeof(char));
//假设s没有分配成功
if(NULL==s)
{
exit(-1);
}
//栈顶指针指向栈底,也就是说栈顶与栈底都指向同一个位置
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
}

//销毁栈
stack * destoryStack(stack *s)
{
//如果栈不存在,表示栈根本没有被初始化
if(NULL==s->base)
{
return ;
}
//进行销毁,也就是将分配的内存空间收回,将栈的一些参数重新设置
free(s->base);
s->top=s->base=NULL;
s->stacksize=0;
return s;
}

//清空栈
stack *clearStack(stack *s)
{
if(NULL==s->base)
{
printf("\n Sorry, stack does not exist!\n");
return ;
}
s->top=s->base;
return s;
}

//取元素
char getStackElem(stack *s)
{
//保存栈顶元素
char topElem;
//如果栈顶指针指向与栈底指针指向同一内存单元时,表示栈为空或者栈不存在
if(s->top=s->base)
{
printf("栈中没有可以被取的元素!\n");
return ;
}
topElem=*(s->top--);
return topElem;
}
//进栈操作
stack *push(stack *s,char elem)
{
//s是否已满,若栈满,重新分配空间
if((s->top-s->base)>STACK_INIT_SIZE)
{
s->base=(char*)realloc(s->base,(STACKINCRENMENT+STACK_INIT_SIZE)*sizeof(char));
if(NULL==s->base)
{
return;
}
//将栈顶指针指向栈顶
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCRENMENT;
}
//将元素e,写入栈顶。
*(s->top)=elem;
s->min=s->top-s->base ==0 ? elem : elem < s->min ? elem : s->min;//取得最小值。top==base时,min=elem,否则取较小的。
s->top++;
return s;

}
//出栈
char pop(stack *s)
{
char elem;
if(s->top==s->base)
{
exit(-1);
}
s->top--;
elem=*(s->top);
return elem;
}

char minofStack(stack *s){
return s->min;
}

int main()
{
stack s;
int i;
char *elem="bcdfg";
char *temp;
//栈的初始化;
initStack(&s);
//插入元素a,b,c,d,e调用push函数
printf("进栈顺序:\n");
temp=elem;
while(*elem!='\0')
{
printf("%3c",*elem);
elem++;
}
elem=temp;
while(*elem !='\0')
{
push(&s,*elem);
elem++;
}

putchar('\n');
printf("min = %3c",minofStack(&s));

//取出元素,调用pop函数
printf("\n出栈顺序:\n");
//while(s.top!=s.base!=NULL)
while(s.top!=NULL && s.base!=NULL)
{
printf("%3c",pop(&s));
}

clearStack(&s);

return 1;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值