物联网
您现在所在的位置:首页>企业动态>物联网

数据结构之栈

编辑:学到牛牛IT培训    发布日期: 2023-09-04 08:59:15  


1.简介

栈(stack)又名堆栈,它是一种访问受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。

向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。故栈又称为先进后出(FILO—first in last out)线性表。


1.png


栈包含的基本操作:

1.入栈操作:在栈顶插入数据

2.出栈操作:在栈顶删除数据

3.栈中没有元素时,称为空栈

4.栈中存储达到预定上限,称为满栈

栈可以使用数组或链表作为物理存储结构,使用数组实现的队列称为顺序栈,使用链表实现的队列称为链式栈。本文针对最常用的顺序栈进行代码实现。

2.顺序栈

顺序栈的实现依赖数组作为底层物理存储结构,其特点是内存连续,并且数组的大小一般在初始时固定(如果使用动态内存可以修改)。

#include <string.h>

#include <stdio.h>

#include <stdlib.h>


struct Stack {

int* buf;

int top;

int maxSize;

};


// 栈初始化

void init(struct Stack* st, int size)

{

st->top = 0;

st->maxSize = size;

st->buf = (int*)malloc(sizeof(int) * size);

}


// 栈内存释放

void destroy(struct Stack* st)

{

free(st->buf);

st->buf = NULL;

}

// 遍历栈

void display(struct Stack* st)

{

printf("stack size = %d, val = ", st->top);

int i = 0;

while (i < st->top) {

printf("%d ", st->buf[i]);

i++;

}

printf(" ");

}

// 判断栈是否为满

int isfull(struct Stack* st)

{

return st->top == st->maxSize;

}

// 判断栈是否为空

int isempty(struct Stack* st)

{

return st->top == 0;

}

// 入栈

int push(struct Stack* st, int val)

{

if (isfull(st)) {  // 栈满,无法入栈,返回-1

return -1;

}

st->buf[st->top] = val;

return st->top++; // 返回入栈的位置

}

// 出栈

int pop(struct Stack* st)

{

if (isempty(st)) {

return -1;

}

return --st->top;

}


// 栈空:返回-1; 栈不空:返回0,pval执行的变量存储获取的栈顶元素

int getTop( struct Stack *st, int *pval )

{

if( isempty( st ) ){

return -1;   // 无栈顶元素

}

*pval = st->buf[st->top - 1];

return 0;

}


int main()

{

struct Stack stack;

init(&stack, 5);

display(&stack);

push(&stack, 10);

push(&stack, 20);

push(&stack, 30);

push(&stack, 40);

push(&stack, 50);

display(&stack);

printf("push ret = %d ", push(&stack, 70));   // 栈满,无法入栈,返回-1

pop(&stack);

pop(&stack);

display(&stack);

printf("push ret = %d ", push(&stack, 70));

display(&stack);

destroy(&stack);

return 0;

}


免费试学
课程好不好,不如实地听一听

推荐阅读

  • 计算机专业的就业难度怎么样?

    国产午夜鲁丝片AV无码蜜臀,福利免费观看午夜体检区,人妻少妇精品无码专区APP,伊人久久大香线蕉成人综合网,国产妓女在线观看视频,亚洲成a人片在线观看尤物,亚洲精品国产一二三无码AV,亚汌国产一区二区三区

  • 嵌入式软件开发学习路线

    国产午夜鲁丝片AV无码蜜臀,福利免费观看午夜体检区,人妻少妇精品无码专区APP,伊人久久大香线蕉成人综合网,国产妓女在线观看视频,亚洲成a人片在线观看尤物,亚洲精品国产一二三无码AV,亚汌国产一区二区三区

  • 为什么自学编程那么难?

    国产午夜鲁丝片AV无码蜜臀,福利免费观看午夜体检区,人妻少妇精品无码专区APP,伊人久久大香线蕉成人综合网,国产妓女在线观看视频,亚洲成a人片在线观看尤物,亚洲精品国产一二三无码AV,亚汌国产一区二区三区

  • IT培训机构出来的到底好不好就业呢?

    国产午夜鲁丝片AV无码蜜臀,福利免费观看午夜体检区,人妻少妇精品无码专区APP,伊人久久大香线蕉成人综合网,国产妓女在线观看视频,亚洲成a人片在线观看尤物,亚洲精品国产一二三无码AV,亚汌国产一区二区三区

封闭学习

2

1

18180749853

蜀ICP备2021001672号

在线咨询 免费试听VIP课程