这里我们假设栈顶指针指示栈顶元素的提前一个位置
- #include <stdio.h>
- #include <malloc.h>
- #define STACK_INIT_SIZE 100
- #define STACKINCREMENT 10
- typedef char ElemType;
- typedef struct
- {
- ElemType *base; //栈底指针
- ElemType *top; //栈顶指针
- int stacksize;
- }sqstack;
- void Clearstack(sqstack *s)
- {
- free(s->base);
- }
- void InitStack(sqstack *s)
- {
- s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
- if ( !s->base)
- {
- printf("InitStack error!");
- return;
- }
- s->top = s->base;
- s->stacksize = STACK_INIT_SIZE;
- }
- void Push(sqstack *s,ElemType e)
- {
- if ( s->top - s->base >= s->stacksize)
- {
- //指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。
- //新的大小一定要大于原来的大小不然的话会导致数据丢失!
- s->base = (ElemType *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(ElemType));
- if ( ! s->base)
- {
- printf("Increase memory error!");
- return;
- }
- s->top = s->base + s->stacksize;
- s->stacksize += STACKINCREMENT;
- }
- *s->top++ = e;
- }
- ElemType Pop(sqstack *s)
- {
- ElemType x;
- if ( s->top != s->base)
- {
- x = *--s->top;
- return x;
- }
- else
- {
- printf("栈为空!\n");
- return ('F');
- }
- }
- int StackLength(sqstack *s)
- {
- int i = 0;
- ElemType *p;
- p = s->top - 1;
- do
- {
- i++;
- p--;
- } while (p != s->base - 1);
- return i;
- }
- int StackEmpty(sqstack *s)
- {
- return(s->top == s->base);
- }
- ElemType Gettop(sqstack *s)
- {
- ElemType e;
- if ( s->top == s->base )
- {
- printf("栈为空!\n");
- return ('F');
- }
- e = *(s->top -1);
- return e;
- }
- void output(sqstack *s)
- {
- ElemType *p;
- p = s->top - 1;
- do
- {
- printf("%c",*p);
- p--;
- } while ( p != s->base - 1);
- printf("\n");
- }
- void main()
- {
- ElemType e;
- sqstack *s;
- s = (sqstack *)malloc(sizeof(sqstack));
- InitStack(s);
- printf("栈为:%s\n",(StackEmpty(s)?"空":"非空"));
- Push(s,'v');
- Push(s,'o');
- Push(s,'y');
- Push(s,'e');
- Push(s,'v');
- Push(s,'o');
- Push(s,'l');
- Push(s,'i');
- printf("栈为:%s\n",(StackEmpty(s)?"空":"非空"));
- printf("栈长度:%d\n",StackLength(s));
- printf("栈顶元素:%c\n",Gettop(s));
- output(s);
- while (!StackEmpty(s))
- {
- e = Pop(s);
- printf("%c",e);
- }
- printf("\n");
- printf("栈为:%s\n",(StackEmpty(s)?"空":"非空"));
- printf("释放栈中...\n");
- Clearstack(s);
- printf("释放栈完成!\n");
- }
转载于:https://blog.51cto.com/591819849/1100779