利用结构体封装一个内部数组,和一个元素游标,就可以实现栈了。
内部数组可以存储在内存的栈中(Stack),也可以动态申请,存储组堆中(Heap)
储存在栈中,则需要制定栈的最大容量。储存在堆中,就可以通过malloc函数申请初始容量,当容量不够后,还可哟通过realloc函数扩充。
下面是用栈储存区实现的,因此不涉及动态内存分配和释放的问题,都由系统帮我们管理。
/********* file : ArrayStack.h date:2016/3/26 *********/ #ifndef _ARRAYSATCK_H_ #define _ARRAYSATCK_H_ #define NULL 0 const int MAX_SIZE = 50; //栈的最大容量 typedef int DataType; typedef struct { DataType InnerArr[MAX_SIZE]; int cur; //实际元素个数的游标 ,初始化为-1 }ArrayStack; void InitStack(ArrayStack* mystack); DataType GetPeek(const ArrayStack* mystack); int Pop(ArrayStack* mystack, DataType*de); int Push(ArrayStack* mystack , DataType newData); int StackIsEmpty(const ArrayStack* mystack); int StackIsFull(const ArrayStack* mystack); void ClearStack(ArrayStack* mystack); int StackLength(const ArrayStack* mystack); #endif
/****************** file:ArrayStack.cpp date:2016/3/26*******************/ #include "ArrayStack.h" //初始化栈 void InitStack(ArrayStack* mystack) { mystack->cur = -1; } DataType GetPeek(const ArrayStack* mystack) { return mystack->InnerArr[mystack->cur]; } int Pop(ArrayStack* mystack, DataType*de) { if(StackIsEmpty(mystack)) return 0; if(de!=NULL) //如果用户需要保存这个被删除的元素 *de = mystack->InnerArr[mystack->cur]; (mystack->cur)--; return 1; } int Push(ArrayStack* mystack , DataType newData) { if(StackIsFull(mystack)) return 0; (mystack->cur)++; mystack->InnerArr[mystack->cur] = newData; return 1; } int StackIsEmpty(const ArrayStack* mystack) { return mystack->cur == -1; } int StackIsFull(const ArrayStack* mystack) { return mystack->cur == MAX_SIZE-1; } void ClearStack(ArrayStack* mystack) { mystack->cur = -1; } int StackLength(const ArrayStack* mystack) { return mystack->cur+1; }
时间: 2024-11-13 08:09:57