说明:
本栈是顺序内存实现的栈,即使用了顺序表的形式实现链栈;;
这里采用了代码复用的方法,即使用了SeqList顺序表,详见《SeqList顺序表》;
栈只能从栈顶Pop出元素,或者获取Top元素而不Pop;
顺序表只能存储固定数量的数据,同时因为其存入的是数据的首地址,所以能够存储任意类型的数据;
下面将给出该数据结构的代码,每个函数的结构分析 ,以及个别主要函数的汇编分析
代码:
SeqStack.h
#ifndef _SEQSTACK_H_
#define _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
SeqStack.c
#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);
}
main.c
#include <stdio.h>
#include <stdlib.h>
#include "SeqStack.h"
int main(int argc, char *argv[])
{
SeqStack* stack = SeqStack_Create(20);
int a[10];
int i = 0;
for(i=0; i<10; i++)
{
a[i] = i;
SeqStack_Push(stack, a + i);
}
printf("Top: %d\n", *(int*)SeqStack_Top(stack));
printf("Capacity: %d\n", SeqStack_Capacity(stack));
printf("Length: %d\n", SeqStack_Size(stack));
while( SeqStack_Size(stack) > 0 )
{
printf("Pop: %d\n", *(int*)SeqStack_Pop(stack));
}
SeqStack_Destroy(stack);
return 0;
}
函数结构分析:
1.SeqList_Create
![](http://i.imgur.com/uPIAQfI.png=400x400)
2.SeqList_Destroy
![](http://i.imgur.com/mKHJqRa.png=400x400)
3.SeqStack_Clear
![](http://i.imgur.com/kYssA4s.png=400x400)
4.SeqStack_Push
![](http://i.imgur.com/WBuFlBl.png=400x400)
5.SeqStack_Pop
![](http://i.imgur.com/IqrjBZW.png=400x400)
6.SeqStack_Top
![](http://i.imgur.com/rJlEThe.png=400x400)
7.SeqStack_Size
![](http://i.imgur.com/UclPQGd.png=400x400)
8.SeqStack_Capacity
![](http://i.imgur.com/wGtZsIH.png=400x400)
汇编分析:
1.SeqList_Create
![](http://i.imgur.com/eUjX9MS.png=400x400)
2.SeqStack_Push
![](http://i.imgur.com/9SiVbya.png=400x400)
3.SeqStack_Pop
![](http://i.imgur.com/lrhL6mZ.png=400x400)