1. 程式人生 > >棧的實現

棧的實現

-s 出棧 特殊 stdio.h style insert return endif white

棧的定義:

棧是一種特殊的線性表

棧僅能在線性表的一端進行操作

棧頂:同意操作的一端

棧底:不同意操作的一端


棧的性質:

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;
}


棧的實現