栈的顺序存储设计与实现
1、stack概念
栈是一种特殊的线性表;栈仅能够在线性表的一段进行操作;栈顶(top)是允许操作的一端;栈底(bottom)是不允许操作的一端。
线性表的顺序存储来模拟栈的顺序存储时,在尾部添加或者删除元素,不会涉及到数组元素的大量移动。
2、设计与实现
栈顺序存储的实现思路基本与线性表的顺序存储思路一致,可参考前面文章理解。点击打开链接
3、代码
(1)seqStack.h
#pragma once #ifndef _MY_SEQSTACK_H_ #define _MY_SEQSTACK_H_ typedef void SeqStack; SeqStack* SeqStack_Create(int capacity); void SeqStack_Destory(SeqStack* stack); void SeqStack_Clear(SeqStack* stack); int SeqStack_Push(SeqStack* stack, void* item); void* SeqStack_Pop(SeqStack* stack); void* SeqStack_Top(SeqStack* stack); int SeqStack_Size(SeqStack* stack); int SeqStack_Capacity(SeqStack* stack); #endif //_MY_SEQSTACK_H_
(2)seqStack.c
#include <stdlib.h> #include <stdio.h> #include <string.h> #include "seqstack.h" #include "seqlist.h" //创建栈 相当于创建线性表 SeqStack* SeqStack_Create(int capacity) { return SeqList_Create(capacity); } //销毁栈 相当于销毁线性表 void SeqStack_Destory(SeqStack* stack) { SeqList_Destory(stack); } //清空栈 相当于清空线性表 void SeqStack_Clear(SeqStack* stack) { SeqList_Clear(stack); } //向栈中压入元素 相当于 向线性表的尾部插入元素 int SeqStack_Push(SeqStack* stack, void* item) { return SeqList_Insert(stack, item, SeqList_Length(stack)); } //从栈中弹出元素 相当于从线性表中删除一个元素 void* SeqStack_Pop(SeqStack* stack) { return SeqList_Delete(stack, SeqList_Length(stack) - 1); } //获取栈顶元素 相当于获取线性表的尾部元素 void* SeqStack_Top(SeqStack* stack) { return SeqList_Get(stack, SeqList_Length(stack) - 1); } //获取栈的大小 相当于获取线性表的实际长度 int SeqStack_Size(SeqStack* stack) { return SeqList_Length(stack); } //获取栈的容量 相当于获取线性表的容量 int SeqStack_Capacity(SeqStack* stack) { return SeqList_Capacity(stack); }
(3)具体实现
#include <stdlib.h> #include <stdio.h> #include <string.h> #include "seqstack.h" typedef struct Teacher { int age; char name[64]; }Teacher; void maindm006() { int ret = 0, i = 0; int a[10]; //创建栈 SeqStack* stack = NULL; stack = SeqStack_Create(10); if (stack == NULL) { ret = -1; printf("func SeqStack_Create() err:%d\n", ret); return ; } //压栈 for (i = 0; i < 5; i++) { a[i] = i + 1; SeqStack_Push(stack, &a[i]); } //打印栈的容量 printf("The stack's capacity:%d \n", SeqStack_Capacity(stack)); //打印栈的长度 printf("The stack's length:%d \n", SeqStack_Size(stack)); //栈顶元素 printf("The stack's Top:%d \n", *((int *)SeqStack_Top(stack))); while (SeqStack_Size(stack) > 0) { int tmp = *((int*)SeqStack_Pop(stack)); printf("tmp:%d ", tmp); } printf("\n"); system("pause"); return; /* SeqStack* SeqStack_Create(int capacity); void SeqStack_Destory(SeqStack* stack); void SeqStack_Clear(SeqStack* stack); int SeqStack_Push(SeqStack* stack, void* item); void* SeqStack_Pop(SeqStack* stack); void* SeqStack_Top(SeqStack* stack); int SeqStack_Size(SeqStack* stack); int SeqStack_Capacity(SeqStack* stack); */ }