顺序栈的设计和实现
1.基本概念
- 栈是一种 特殊的线性表
- 栈仅能在线性表的一端进行操作
- 栈顶(Top):允许操作的一端
- 栈底(Bottom):不允许操作的一端
2.常用操作
- 创建栈
- 销毁栈
- 清空栈
- 进栈
- 出栈
- 获取栈顶元素
- 获取栈的大小
3.顺序栈的示意图
4.设计和实现
这里我们用尾插法(再线性表的尾部插入栈元素)来描述栈的设计与实现。
- 头文件
#ifndef __SEQSTACK_H__
#define __SEQSTACK_H__
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
typedef void SeqStack;//数据类型封装,对应栈的起始位置
typedef void SeqStackNode;//数据类型封装,对应栈里面的元素的起始地址
SeqStack * SeqStack_Create(int capacity);
void SeqStack_Destroy(SeqStack * stack);
void SeqStack_Clear(SeqStack * stack);
int SeqStack_Push(SeqStack * stack, SeqStackNode *node);
SeqStackNode* SeqStack_Pop(SeqStack * stack);
SeqStackNode* SeqStack_Top(SeqStack * stack);
int SeqStack_Length(SeqStack * stack);
int SeqStack_Capacity(SeqStack * stack);
#endif
- 实现文件
#include "seqstack.h"
#include "seqlist.h"
/*创建*/
SeqStack * SeqStack_Create(int capacity)
{
SeqStack * tmp = (SeqStack *)SeqList_Create(capacity);
return tmp;
}
/*销毁*/
void SeqStack_Destroy(SeqStack * stack)
{
SeqList_Destroy((SeqList *)stack);
}
/*清空*/
void SeqStack_Clear(SeqStack * stack)
{
SeqList_Clear((SeqList *)stack);
}
/*压栈-->在线性表尾部插入*/
int SeqStack_Push(SeqStack * stack, SeqStackNode *node)
{
return SeqList_Insert((SeqList *)stack, (SeqListNode*)node, SeqList_Length((SeqList *)stack));
}
/*出栈-->在线性表尾部删除*/
SeqStackNode* SeqStack_Pop(SeqStack * stack)
{
return SeqList_Delete((SeqList *)stack, SeqList_Length((SeqList *)stack)-1);
}
/*返回栈顶元素-->在线性表尾部获取*/
SeqStackNode* SeqStack_Top(SeqStack * stack)
{
return SeqList_Get((SeqList *)stack, SeqList_Length((SeqList *)stack) - 1);
}
/*获取栈里面的元素个数*/
int SeqStack_Length(SeqStack * stack)
{
return SeqList_Length((SeqList *)stack);
}
/*获取栈的容量*/
int SeqStack_Capacity(SeqStack * stack)
{
return SeqList_Capacity((SeqList *)stack);
}
- 测试文件
#include "seqstack.h"
int main(void)
{
SeqStack * stack = NULL;//局部变量--栈的起始位置
int i = 0;
int a[10];
stack = SeqStack_Create(10);
if (stack == NULL)
{
return -1;
}
for (i = 0; i < 5;i++)
{
a[i] = i + 1;
SeqStack_Push(stack, (SeqStackNode *)&a[i]);
}
printf("Capacity : %d\n",SeqStack_Capacity(stack));
printf("Length : %d\n", SeqStack_Length(stack));
printf("Top : %d\n", *((int *)SeqStack_Top(stack)));
while (SeqStack_Length(stack) > 0)
{
printf("Pop: %d\n", *((int *)SeqStack_Pop(stack)));
}
SeqStack_Destroy(stack);
system("pause");
return 0;
}