棧的實現
棧的定義:
棧是一種特殊的線性表
棧僅能在線性表的一端進行操作
棧頂:同意操作的一端
棧底:不同意操作的一端
棧的性質:
LIFO 後進先出原則
鏈式棧
linkStack.h
#ifndef _LINKSTACK_H_
#define _LINKSTACK_H_
typedef void LinkStack; //給void 起一個新的名字,是LinkStack,這樣寫的會讓函數的安全性變高。在main函數中不能改變類型
LinkStack* LinkStack_Create(); //創建棧
void LinkStack_Destroy(LinkStack* stack);
void LinkStack_Clear(LinkStack* stack); //清空棧
int LinkStack_Push(LinkStack* stack, void* item); //壓棧
void* LinkStack_Pop(LinkStack* stack); //出棧
void* LinkStack_Top(LinkStack* stack); //棧頂
int LinkStack_Size(LinkStack* stack); //棧的大小
#endif
LinkStack.c
.c的一大特色是代碼復用,就是在當中增加寫LinkList.h鏈表時候的代碼。降低代碼量
#include <malloc.h>
#include "LinkStack.h"
#include "LinkList.h" //代碼復用時候增加的頭文件
typedef struct _tag_LinkStackNode
{
LinkListNode header;
void* item;
} TLinkStackNode;
LinkStack* LinkStack_Create() //創建順序棧和創建線性表是一樣的
{
return LinkList_Create();
}
void LinkStack_Destroy(LinkStack* stack)
{
LinkStack_Clear(stack); //須要想將棧中的元素清空。然後再使用鏈表銷毀的方式銷毀,這樣防止內存泄漏
LinkList_Destroy(stack);
}
void LinkStack_Clear(LinkStack* stack) //清空棧。由於棧僅僅能從棧頂出,那僅僅要棧不是空的。就不停的出棧(彈出棧頂元素)
{
while( LinkStack_Size(stack) > 0 )
{
LinkStack_Pop(stack);
}
}
int LinkStack_Push(LinkStack* stack, void* item) //入棧 所要進入的棧 所要進入元素的地址
{
TLinkStackNode* node = (TLinkStackNode*)malloc(sizeof(TLinkStackNode)); //創建一個node
int ret = (node != NULL) && (item != NULL); //確定一個返回值,依據這個值觀察進棧是否成功
//創建內存成功,node不為空 且 增加的元素的地址不為空
if( ret )
{
node->item = item; //將數據item寫入node->item中
ret = LinkList_Insert(stack, (LinkListNode*)node, 0); //增加棧中
}
if( !ret ) //釋放內存
{
free(node);
}
return ret;
}
void* LinkStack_Pop(LinkStack* stack)
{
TLinkStackNode* node = (TLinkStackNode*)LinkList_Delete(stack, 0);
void* ret = NULL;
if( node != NULL )
{
ret = node->item;
free(node);
}
return ret;
}
void* LinkStack_Top(LinkStack* stack) //棧頂
{
TLinkStackNode* node = (TLinkStackNode*)LinkList_Get(stack, 0); //依據鏈表的獲取得到棧頂
void* ret = NULL;
if( node != NULL )
{
ret = node->item; //不為空。得到棧頂元素
}
return ret; //返回item
}
int LinkStack_Size(LinkStack* stack)
{
return LinkList_Length(stack);
}
main.c
#include <stdio.h>
#include <stdlib.h>
#include "LinkStack.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[])
{
LinkStack* stack = LinkStack_Create();
int a[10];
int i = 0;
for(i=0; i<10; i++)
{
a[i] = i;
LinkStack_Push(stack, a + i);
}
printf("Top: %d\n", *(int*)LinkStack_Top(stack));
printf("Length: %d\n", LinkStack_Size(stack));
while( LinkStack_Size(stack) > 0 )
{
printf("Pop: %d\n", *(int*)LinkStack_Pop(stack));
}
LinkStack_Destroy(stack);
return 0;
}
棧的實現