C语言数据结构学习之栈

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

栈的基本特点

  • 只能在表尾(即栈顶)进行增加和删除操作
  • 遵循先进后出(First In Last Out),简称FILO结构
    在这里插入图片描述
  • 是一种线性结构

栈的基本操作

栈的基本操作有进栈,出栈,初始化,判断是否满栈,栈是否为空,栈的大小,取栈顶元素等等
(1)头文件及宏定义

#include <stdio.h>
#include <stdlib.h>
//返回真或返回假
#define TRUE 1
#define FALSE 0
//返回执行状态
#define OK 1
#define ERROR 0
#define INFEASIBLE -1

#define OVERFLOW -2 //内存分配失败,用于exit语句

typedef int Status;    //定义函数返回类型
typedef int SElemType; //定义元素类型

#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10

拓展(c++中):在c++中,有关于栈的标准库,使用相应的头文件即可调用c++库中的栈的操作。其头文件为:#include < stack >
(2)创建栈

typedef struct
{
    SElemType *base; //栈底指针,值为NULL表明栈不存在
    SElemType *top;  //栈顶指针,栈顶元素的下一个地址
    int stacksize;   //当前已分配空间,以元素为单位
} SqStack;

拓展(c++):c++中创建栈直接用:stack < int > s;创建一个空的s栈,其中“<>”中所填写的是数据类型,也可以是string等等
(3)初始化

Status initStack(SqStack &s)
{
    s.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); //申请空间
    if (!s.base)
        exit(OVERFLOW);
    s.top = s.base;
    s.stacksize = STACK_INIT_SIZE;
    return OK;
}

(4)入栈

Status push(SqStack &s, SElemType e)
{
    if (s.top - s.base >= s.stacksize)
    {
        s.base = (SElemType *)realloc(s.base, (s.stacksize + STACK_INCREMENT) * sizeof(SElemType));
        s.top = s.base + s.stacksize;
        s.stacksize += STACK_INCREMENT;
    }
    *s.top++ = e;
    return OK;
}

拓展(c++):c++中入栈(或压栈)直接调用,即s.push(a);a为要入栈的元素,a必须与栈s的类型一致。
(5)出栈:

Status pop(SqStack &s, SElemType &e)
{
    e = *(--s.top);
    return OK;
}

拓展(c++):c++中出栈:s.pop();
(7)取栈顶元素:

Status getTop(SqStack s, SElemType &e)
{
    e = *(s.top - 1);
    return OK;
}

拓展(c++):x=s.top();
(8)判断栈是否为空:

Status isEmpty(SqStack s)
{
    if (s.top == s.base)
        return TRUE;
    return FALSE;
}

拓展(c++):s.empty(),若为空,则s.empty()==1,若不为空,则s.empty()==0;
(9)返回栈的元素个数

int getStackElemNum(SqStack s)
{
    return s.top - s.base;
}

拓展(c++):s.size();
(10)销毁栈:

Status destoryStack(SqStack *s)
{
    free(s->base);
    s->base = NULL;
    s->top = NULL;
    s->stacksize = 0;
    return OK;
}

好了,关于栈的学习就到这儿,如若文章有何问题,敬请指出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微睇藐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值