前面我們學習了順序鏈表,我們可能會覺得順序鏈表有啥用呢?基本都是要被淘汰了用法。
呵呵,俗話說:存在的即是合理的。下面我來炫炫它的用法,請睜大你的眼睛,下面是見證奇蹟的時刻。
第六個例子,順序棧的實現:
頭文件要包含兩部分,一個是我們先前實現的順序表,不清楚,出門右轉,看前面的文章
頭文件
#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!順序棧介紹完畢!