码迷,mamicode.com
首页 > 其他好文 > 详细

栈的实现

时间:2017-05-13 13:28:36      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:清空   getc   delete   获取   getch   int   防止   复用   header   

栈的定义:

栈是一种特殊的线性表

栈仅能在线性表的一端进行操作

栈顶:同意操作的一端

栈底:不同意操作的一端


栈的性质:

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


栈的实现

标签:清空   getc   delete   获取   getch   int   防止   复用   header   

原文地址:http://www.cnblogs.com/zsychanpin/p/6848639.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!