Stack.h(函数声明)
- #pragma once
- #include
- #include
- #include
- #include
//C语言没有bool类型,需要包含头文件才能使用。 - typedef int STDatatype;
- typedef struct Stack
- {
- STDatatype* a;
- int top;//标识栈顶的位置
- int capacity;//顺序栈的容量
- }ST;
-
- //初始化
- void StackInit(ST* ps);
-
- //销毁
- void StackDestroy(ST* ps);
-
- //入栈
- void StackPush(ST* ps,STDatatype x);
-
- //出栈
- void StackPop(ST* ps);
-
- //获取栈顶的数据
- STDatatype StackTop(ST* ps);
-
- //判断栈是否为空
- bool StackEempty(ST* ps);
-
- //获取栈中多少个数据
- int StackSize(ST* ps);
Stack.c(函数实现)
- #include"Stack.h"
-
- //初始化
- void StackInit(ST* ps)
- {
- assert(ps);
- ps->a = NULL;
- ps->top = 0;
- ps->capacity = 0;
- }
-
- //销毁
- void StackDestroy(ST* ps)
- {
- assert(ps);
- free(ps->a);
- ps->a = NULL;
- ps->top = 0;
- ps->capacity = 0;
- }
-
- //入栈
- void StackPush(ST* ps, STDatatype x)
- {
- assert(ps);
- //判断栈是否满
- if (ps->top == ps->capacity)//top初始值为0,作为下标时是表示入栈下一个元素的位置。
- {
- int newcapacity = (ps->capacity == 0) ? 4 : 2 * (ps->capacity);
- STDatatype* tmp = (STDatatype*)realloc(ps->a, newcapacity*sizeof(STDatatype));
- if (tmp)
- {
- ps->a = tmp;
- ps->capacity = newcapacity;
- }
- else
- {
- printf("realloc fail\n");
- exit(-1);
- }
- }
- ps->a[ps->top] = x;
- ps->top++;
- }
-
- //出栈
- void StackPop(ST* ps)
- {
- assert(ps);
- if (ps->top == 0)
- {
- printf("栈为空,无法出栈\n");
- exit(-1);
- }
- else
- {
- ps->top--;
- }
- }
-
- //获取栈顶的数据
- STDatatype StackTop(ST* ps)
- {
- assert(ps);
- if (ps->top == 0)
- {
- printf("栈为空,无法出栈\n");
- exit(-1);
- }
- else
- {
- return ps->a[ps->top-1];
- }
- }
-
- //判断栈是否为空
- bool StackEempty(ST* ps)
- {
- assert(ps);
- return ps->top == 0;
- }
-
- //获取栈中数据的个数
- int StackSize(ST* ps)
- {
- assert(ps);
- return ps->top;
- }
Test.c(函数测试)
- #include"Stack.h"
- void TestStack1()
- {
- ST st;
- //栈初始化
- StackInit(&st);
- //入栈
- StackPush(&st, 1);
- StackPush(&st, 2);
- StackPush(&st, 3);
- StackPush(&st, 4);
- StackPush(&st, 5);
- //栈不为空,打印栈顶元素,再出栈。
- while (!StackEempty(&st))
- {
- printf("%d ", StackTop(&st));
- StackPop(&st);
- }
- //销毁栈
- StackDestroy(&st);
- }
-
- void TestStack2()//出栈的不同顺序
- {
- ST st;
- StackInit(&st);
- StackPush(&st, 1);
- StackPush(&st, 2);
- StackPush(&st, 3);
- printf("%d ", StackTop(&st));
- StackPop(&st);
- printf("%d ", StackTop(&st));
- StackPop(&st);
- StackPush(&st, 4);
- StackPush(&st, 5);
- while (!StackEempty(&st))
- {
- printf("%d ", StackTop(&st));
- StackPop(&st);
- }
- StackDestroy(&st);
- }
-
- int main()
- {
- TestStack1();
- return 0;
- }