#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; }