栈,首先是一个线性表,也就是说,栈元素具有线性关系,即前驱后继关系。只不过它是一种特殊的线性表而已。它的特殊之处在于限制了线性表的插入和删除位置,它始终在栈顶进行,这就使得栈底是固定的,最先入栈的元素最后才能出栈。那么,我们根据栈的定义完全可以选用线性表进行模拟。我们知道线性表的实现由两种方式,即线性表顺序存储(顺序表)和线性表链式存储(链表)。在这里只能选用线性表的顺序存储实现方式来模拟栈的顺序存储,只不过我们选择尾插法插入数据(相当于最最先入栈的元素排在栈底,以此类推),获取数据我们应该从线性表的尾部开始获取或弹出(相当于最后入栈的元素最先出栈)。我们按照栈的定义通过限制线性表的插入删除操作模拟出了一个顺序栈。因此,我们借入之前在线性表的顺序存储API这篇博文实现的程序基础上来模拟顺序栈的行为,将seqlist.h和seqlist.c加入工程并添加如下文件:
seqstack.h
#ifndef _MY_SEQSTACK_H_
#define _MY_SEQSTACK_H_
typedef void SeqStack;
SeqStack* Stack_Create(int capacity);
void Stack_Destroy(SeqStack* stack);
void Stack_Clear(SeqStack* stack);
int Stack_Push(SeqStack* stack, void* item);
void* Stack_Pop(SeqStack* stack);
void* Stack_Top(SeqStack* stack);
int Stack_Size(SeqStack* stack);
int Stack_Capacity(SeqStack* stack);
#endif //_MY_SEQSTACK_H_
seqstack.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include<stdio.h>
#include <string.h>
#include "seqstack.h"
#include "seqlist.h"
//创建栈 相当于创建线性表
SeqStack* Stack_Create(int capacity)
{
return SeqList_Create(capacity);
}
//销毁栈 相当于销毁线性表
void Stack_Destroy(SeqStack* stack)
{
SeqList_Destroy(stack);
}
//清空栈 相当于清空线性表
void Stack_Clear(SeqStack* stack)
{
SeqList_Clear(stack);
}
//向栈压入数据 相当于向线性表尾插法插入元素0123456789
int Stack_Push(SeqStack* stack, void* item)
{
return SeqList_Insert(stack,item,SeqList_Length(stack));//尾部插
}
//从栈中弹出元素 相等于从线性表的尾部拿出元素
void* Stack_Pop(SeqStack* stack)
{
return SeqList_Delete(stack,SeqList_Length(stack)-1);
}
//获取栈顶元素 相等于获取链表尾部元素
void* Stack_Top(SeqStack* stack)
{
return SeqList_Get(stack,SeqList_Length(stack)-1);
}
//获取栈的大小 相等于获取线性表的大小
int Stack_Size(SeqStack* stack)
{
return SeqList_Length(stack);
}
//获取栈的容量 相等于获取线性表的容量
int Stack_Capacity(SeqStack* stack)
{
return SeqList_Capacity(stack);
}
stacktest.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include<stdio.h>
#include <string.h>
#include "seqstack.h"
int main()
{
SeqStack* stack = NULL;
int capacity = 10,size;
int i;
int a[10];
int *p = NULL;
stack =Stack_Create(capacity);
if (stack==NULL)
{
return;
}
for (i =0;i<capacity;i++)
{
a[i] = i+1;
Stack_Push(stack, &a[i]);
}
capacity = Stack_Capacity(stack);
printf("Capacity:%d\n",capacity);
size = Stack_Size(stack);
printf("size:%d\n",size);
p = (int*) Stack_Top(stack);
printf("Top:%d\n",*p);
while (Stack_Size(stack)>0)
{
int tmp = *((int*)Stack_Pop(stack));
printf("tmp:%d\n",tmp);
}
system("pause");
return 0;
}