顺序栈的设计和实现

顺序栈的设计和实现

1.基本概念

  • 是一种 特殊的线性表
  • 栈仅能在线性表的一端进行操作
  • 栈顶(Top):允许操作的一端
  • 栈底(Bottom):不允许操作的一端
    这里写图片描述

2.常用操作

  • 创建栈
  • 销毁栈
  • 清空栈
  • 进栈
  • 出栈
  • 获取栈顶元素
  • 获取栈的大小

3.顺序栈的示意图

这里写图片描述

4.设计和实现

这里我们用尾插法(再线性表的尾部插入栈元素)来描述栈的设计与实现。

  • 头文件
#ifndef __SEQSTACK_H__
#define __SEQSTACK_H__
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

typedef void SeqStack;//数据类型封装,对应栈的起始位置

typedef void SeqStackNode;//数据类型封装,对应栈里面的元素的起始地址

SeqStack * SeqStack_Create(int capacity);

void SeqStack_Destroy(SeqStack * stack);

void SeqStack_Clear(SeqStack * stack);

int SeqStack_Push(SeqStack * stack, SeqStackNode *node);

SeqStackNode* SeqStack_Pop(SeqStack * stack);


SeqStackNode* SeqStack_Top(SeqStack * stack);

int SeqStack_Length(SeqStack * stack);

int SeqStack_Capacity(SeqStack * stack);


#endif
  • 实现文件
#include "seqstack.h"
#include "seqlist.h"


/*创建*/
SeqStack * SeqStack_Create(int capacity)
{
    SeqStack * tmp = (SeqStack *)SeqList_Create(capacity);

    return  tmp;
}

/*销毁*/
void SeqStack_Destroy(SeqStack * stack)
{
    SeqList_Destroy((SeqList *)stack);
}

/*清空*/
void SeqStack_Clear(SeqStack * stack)
{
    SeqList_Clear((SeqList *)stack);
}


/*压栈-->在线性表尾部插入*/
int SeqStack_Push(SeqStack * stack, SeqStackNode *node)
{
    return SeqList_Insert((SeqList *)stack, (SeqListNode*)node, SeqList_Length((SeqList *)stack));
}


/*出栈-->在线性表尾部删除*/
SeqStackNode* SeqStack_Pop(SeqStack * stack)
{
    return SeqList_Delete((SeqList *)stack, SeqList_Length((SeqList *)stack)-1);
}

/*返回栈顶元素-->在线性表尾部获取*/
SeqStackNode* SeqStack_Top(SeqStack * stack)
{
    return SeqList_Get((SeqList *)stack, SeqList_Length((SeqList *)stack) - 1);
}

/*获取栈里面的元素个数*/
int SeqStack_Length(SeqStack * stack)
{
    return SeqList_Length((SeqList *)stack);
}

/*获取栈的容量*/
int SeqStack_Capacity(SeqStack * stack)
{
    return SeqList_Capacity((SeqList *)stack);
}
  • 测试文件
#include "seqstack.h"
int main(void)
{

    SeqStack * stack = NULL;//局部变量--栈的起始位置
    int i = 0;
    int a[10];

    stack = SeqStack_Create(10);
    if (stack == NULL)
    {
        return -1;
    }

    for (i = 0; i < 5;i++)
    {
        a[i] = i + 1;
        SeqStack_Push(stack, (SeqStackNode *)&a[i]);
    }

    printf("Capacity : %d\n",SeqStack_Capacity(stack));
    printf("Length : %d\n", SeqStack_Length(stack));
    printf("Top : %d\n", *((int *)SeqStack_Top(stack)));

    while (SeqStack_Length(stack) > 0)
    {
        printf("Pop: %d\n", *((int *)SeqStack_Pop(stack)));
    }

    SeqStack_Destroy(stack);

    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值