Stack基本概念
栈是一种 特殊的线性表
栈仅能在线性表的一端进行操作
栈顶(Top):允许操作的一端
栈底(Bottom):不允许操作的一端
Stack的常用操作
创建栈
销毁栈
清空栈
进栈
出栈
获取栈顶元素
获取栈的大小
栈的顺序存储设计与实现
1、基本概念
栈的顺序存储结构与线性表的顺序存储结构类似,内部都是用数组实现的。
2、设计与实现
定义文件:#ifndef _MY_SEQSTACK_H_
#define _MY_SEQSTACK_H_
typedef void SeqStack;
SeqStack* SeqStack_Create(int capacity);
void SeqStack_Destroy(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_
栈的实现是借助线性表的顺序存储结构模拟的,因此通过调用线性表的顺序存储结构的API封装成栈的顺序存储结构的操作函数
如果对 线性表的顺序存储结构的API不熟,可参看线性表的顺序存储结构API实现
顺序存储结构stack的实现:
#include "seqstack.h"
#include "seqlist.h" //线性表的顺序存储头文件
SeqStack* SeqStack_Create(int capacity)
{
return SeqList_Create(capacity);
}
void SeqStack_Destroy(SeqStack* stack)
{
SeqList_Destroy(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);
}
测试文件:
void main()
{
int a[20], i = 0;
int *pTmp = NULL;
SeqStack* stack = NULL;
stack = SeqStack_Create(20);
for (i=0; i<10; i++)
{
a[i] = i+1;
//SeqStack_Push(stack, &a[i]);
SeqStack_Push(stack, a+i);
}
pTmp = (int *)SeqStack_Top(stack);
printf("top:%d \n", *pTmp);
printf("capacity:%d \n", SeqStack_Capacity(stack));
printf("size:%d \n", SeqStack_Size(stack));
//元素出栈
while (SeqStack_Size(stack) > 0)
{
printf("pop:%d \n", *((int *)SeqStack_Pop(stack)) );
}
SeqStack_Destroy(stack);
system("pause");
}