前面我们学习了顺序链表,我们可能会觉得顺序链表有啥用呢?基本都是要被淘汰了用法。
呵呵,俗话说:存在的即是合理的。下面我来炫炫它的用法,请睁大你的眼睛,下面是见证奇迹的时刻。
第六个例子,顺序栈的实现:
头文件要包含两部分,一个是我们先前实现的顺序表,不清楚,出门右转,看前面的文章
头文件
#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_Length(SeqStack* stack);
int SeqStack_Capacity(SeqStack* stack);
int SeqStack_Push(SeqStack* stack, void* node);
void* SeqStack_Pop(SeqStack* stack);
void* SeqStack_Top(SeqStack* stack);
#endif
我个人有点小小的强迫症,代码尽量要求简洁,所以没有注释,有什么不明白的可以留言。
实现文件
#include "SeqStack.h"
#include "SeqList.h"
#include <stdlib.h>
SeqStack* SeqStack_Create(int capacity)
{
SeqList_Create(capacity);
}
void SeqStack_Destroy(SeqStack* stack)
{
SeqList_Destroy(stack);
}
void SeqStack_Clear(SeqStack* stack)
{
SeqList_Clear(stack);
}
int SeqStack_Length(SeqStack* stack)
{
SeqList_Length(stack);
}
int SeqStack_Capacity(SeqStack* stack)
{
SeqList_Capacity(stack);
}
int SeqStack_Push(SeqStack* stack, void* node)
{
int ret = -1;
ret = SeqList_Insert(stack, node, SeqStack_Length(stack));
return ret;
}
void* SeqStack_Pop(SeqStack* stack)
{
void* ret = NULL;
ret = SeqList_Delete(stack, SeqStack_Length(stack) - 1);
return ret;
}
void* SeqStack_Top(SeqStack* stack)
{
void* ret = NULL;
ret = SeqList_Get(stack, SeqStack_Length(stack) - 1);
return ret;
}
有木有觉得很惊讶!!没有错,就是这么的简单!
测试文件
#include <stdio.h>
#include <stdlib.h>
#include "SeqStack.h"
int main(int argc, char *argv[])
{
SeqStack* stack = SeqStack_Create(10);
int a[5] = {1,2,3,4,5};
int i = 0;
printf("capacity = %d\n", SeqStack_Capacity(stack));
for (i = 0; i < 5; i++)
{
SeqStack_Push(stack, a + i);
printf("Top:%d\n", *(int*)SeqStack_Top(stack));
}
printf("length = %d\n", SeqStack_Length(stack));
while(SeqStack_Length(stack) > 0)
{
printf("Pop:%d\n", *(int*)SeqStack_Pop(stack));
}
system("PAUSE");
return 0;
}
好了,炫技完毕!是不是觉得很有用呢?这里说个小技巧,
我们入栈的时候是直接把顺序表的尾部当作栈顶,
这样可以避免入栈的时候移动大量数据,OK!顺序栈介绍完毕!