栈的顺序存储设计与实现
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);
*/
}