- #include <stdio.h>
- #include <stdlib.h>
- #define INITIAL_STACK_SIZE 100
- #define INCREASE_STACK_SIZE 10 // 大于一个元素的内存大小
- typedef int ElemType;
- typedef struct Stack
- {
- ElemType *top;
- ElemType *base;
- int stacksize; // 记录栈的大小
- }Stack,*Pstack;
- void InitStack(Pstack L);
- void Push(Pstack L,ElemType i);
- ElemType Pop(Pstack L);
- void DestroyStack(Pstack L);
- bool StackEmpty(Pstack L);
- int StackLength(Pstack L);
- ElemType GetTop(Pstack L);
- void StackTraverse(Pstack L);
- void main ()
- {
- int size;
- Stack stack;
- Pstack L = &stack;
- InitStack(L);
- printf("请输入栈大小: ");
- scanf("%d",&size);
- for (int i = 1; i <= size; i++)
- {
- Push(L,i);
- }
- StackTraverse(L);
- if (StackEmpty)
- {
- printf("栈顶元素为:%d\n",GetTop(L));
- Pop(L);
- printf("弹栈 弹出栈顶元素:\n");
- StackTraverse(L);
- printf("栈内的元素个数为:%d\n",StackLength(L));
- }
- DestroyStack(L);
- L = NULL;
- }
- void InitStack(Pstack L)
- {
- L->base = (ElemType *)malloc(INITIAL_STACK_SIZE * sizeof(ElemType));
- if (! L->base)
- exit(-1);
- L->top = L->base;
- L->stacksize = INITIAL_STACK_SIZE;
- }
- void Push(Pstack L,ElemType i)
- {
- if (L->top - L->base >= L->stacksize){
- L->base = (ElemType *)realloc(L->base,(INITIAL_STACK_SIZE+INCREASE_STACK_SIZE)* sizeof(ElemType));
- L->top = L->base + L->stacksize;
- L->stacksize += INCREASE_STACK_SIZE;
- }
- *(L->top++) = i;
- }
- ElemType Pop(Pstack L)
- {
- if (L->top != L->base) // 栈不为空
- {
- i = * -- L->top;
- }
- return i;
- }
- void DestroyStack(Pstack L)
- {
- for (ElemType * p = L->base; p < L->top; p++)
- {
- *p = 0;
- }
- L->top = L->base = NULL;
- }
- bool StackEmpty(Pstack L)
- {
- if (L->base != L->top)
- return false;
- else
- return true;
- }
- int StackLength(Pstack L)
- {
- int num = 0;
- for (ElemType * p = L->base; p < L->top; p++)
- {
- num++;
- }
- return num;
- }
- ElemType GetTop(Pstack L)
- {
- ElemType e = * (L->top-1);
- return e;
- }
- void StackTraverse(Pstack L)
- {
- ElemType * p = L->base;
- while (p != L->top)
- {
- printf("%d\t",*p++);
- }
- printf("\n");
- }