首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-09-08 
C语言栈的简易实现,包含O(1)时间复杂度的min方法#includestdio.h#includestdlib.h#includemalloc.h#

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

#include<stdio.h>#include<stdlib.h>#include<malloc.h>#include<string.h>//定义栈的初始分配空间#define STACK_INIT_SIZE 100//栈的分配增量#define STACKINCRENMENT 10typedef 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;}

热点排行