欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第11节 栈的定义及实现

程序员文章站 2022-06-17 09:06:13
...

-------------------------------------资源来源于网络,仅供自学使用,如有侵权,联系我必删.

第一:

栈的定义

? 栈是一种特殊的线性表
? 栈仅能在线性表的一端进行操作
?  栈顶(Top) : 允许操作的一端
?  栈底(Bottom) : :不允许操作的一端

? 性质 : 后进先出(  LIFO )

第二:

? 栈的一些常用操作
?  创建栈
?  销毁栈
?  清空栈
?  进栈
?  出栈
?  获取栈顶元素
? 获取栈的大小

 

第三:

栈的顺序实现:

基于SeqList.cSeqList.h 顺序表实现栈的操作

#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_Push(SeqStack* stack, void* item);//进栈

void* SeqStack_Pop(SeqStack* stack);//出栈

void* SeqStack_Top(SeqStack* stack);//获取栈顶元素

int SeqStack_Size(SeqStack* stack);//获取栈的大小

int SeqStack_Capacity(SeqStack* stack);//顺序栈的容量

#endif
#include "SeqStack.h"
#include "SeqList.h"

SeqStack* SeqStack_Create(int capacity)
{
    return SeqList_Create(capacity);
}

void SeqStack_Destroy(SeqStack* stack)
{
    SeqList_Destroy(stack);
}

void SeqStack_Clear(SeqStack* stack)
{
    SeqList_Clear(stack);
}

int SeqStack_Push(SeqStack* stack, void* item)
{
    return SeqList_Insert(stack, item, SeqList_Length(stack));
}

void* SeqStack_Pop(SeqStack* stack)
{
    return SeqList_Delete(stack, SeqList_Length(stack) - 1);
}

void* SeqStack_Top(SeqStack* stack)
{
    return SeqList_Get(stack, SeqList_Length(stack) - 1);
}

int SeqStack_Size(SeqStack* stack)
{
    return SeqList_Length(stack);
}

int SeqStack_Capacity(SeqStack* stack)
{
    return SeqList_Capacity(stack);
}
#include <stdio.h>
#include <stdlib.h>
#include "SeqStack.h"

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) 
{
    SeqStack* stack = SeqStack_Create(20);
    int a[10];
    int i = 0;
    
    for(i=0; i<10; i++)
    {
        a[i] = i;
        
        SeqStack_Push(stack, a + i);
    }
    //栈:后进先出
    printf("Top: %d\n", *(int*)SeqStack_Top(stack));   //用指针取出栈顶元素  9
    printf("Capacity: %d\n", SeqStack_Capacity(stack));//容量   20
    printf("Length: %d\n", SeqStack_Size(stack));      //大小   10
    
    while( SeqStack_Size(stack) > 0 )
    {
        printf("Pop: %d\n", *(int*)SeqStack_Pop(stack));
    }
    
    SeqStack_Destroy(stack);
    
	return 0;
}

第11节 栈的定义及实现

第四:

栈的链式实现

基于LinkList.cLinkList.h 链表实现栈的操作

#ifndef _LINKSTACK_H_
#define _LINKSTACK_H_

typedef void LinkStack;

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
#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));//申请结点空间
    int ret = (node != NULL) && (item != NULL);//结点申请成功
    
    if( ret )
    {
        node->item = item;//保存传入的item
        
        ret  = LinkList_Insert(stack, (LinkListNode*)node, 0);//将node存入链表里面
    }
    
    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;//将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;
}

int LinkStack_Size(LinkStack* stack)
{
    return LinkList_Length(stack);
}

 

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

 

第11节 栈的定义及实现

 

小结

? 栈是一种特殊的线性表
? 栈只允许在线性表的一端进行操作
? 栈通常有两种实现方式

     顺序结构实现
     链式结构实现

相关标签: 数据结构与算法