【备战春招】第19天 嵌入式工程师学习笔记
课程信息
- 课程名称:物联网/嵌入式工程师
- 章节名称:第5周之第三讲 1-1 顺序栈讲解
- 讲师姓名:大白老师
课程内容概述
1. 简介
本节介绍了C语言中的单向循环链表。
栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈),允许进行操作的一端称为“栈顶”,另一固定端称为“栈底”,当栈中没有元素时称为“空栈”。
顺序栈:栈的顺序存储结构叫做顺序栈。
2. 图形操作
-
特点
LIFO :last in first out ,后进先出。 -
基本概念
栈顶:一般用变量top来表示,在线性栈中表示我们数组的下标。 -
本质
栈就是我们特殊一点的线性表。同样具有前驱和后继,只不过,它限定了我们只能在一端进行插入和删除操作的线性表。也就是说,我们其实栈底是固定的,随着元素的增加,我们的栈顶top的值在变化。
3. 出栈和入栈
-
入栈
栈的插入操作,我们叫做入栈。类似于子弹入弹夹。
-
出栈
栈的删除操作,我们叫做出栈。类似于子弹射出。
-
结论
顺序栈其实就是相当于我们的数组的操作,只不过这里多了一个top记录栈顶,其实就是相当于记录数组最后一个元素的下标。
-
栈的初始值
思考:空栈的时候,top的初始值是多少?
- 假设top初值是0.
- 假设top初值是-1
4. 代码示例
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 50
typedef char data_t;
typedef struct {
data_t buf[MAX];
int top;
} sepstack_t;
sepstack_t *create_sepstack()//创建新的栈
{
sepstack_t *p = (sepstack_t *) malloc(sizeof(sepstack_t));
if (NULL == p) {
printf("malloc is fail!\n");
return NULL;
}
memset(p, 0, sizeof(sepstack_t));
p->top = -1;
return p;
}
void push_sepstack(sepstack_t *p, data_t data)//入栈
{
p->buf[++p->top] = data;
return;
}
data_t pop_sepstack(sepstack_t *p)//出栈
{
return p->buf[p->top--];
}
int is_empty_sepstack(sepstack_t *p)//判空
{
return p->top == -1 ? 1 : 0;
}
int is_fuli_sepstack(sepstack_t *p)//判满
{
return p->top == MAX - 1 ? 1 : 0;
}
int main() {
data_t data[MAX];
int i = 0;
strcpy(data, "anihc evol I");
int len = strlen(data);
data_t res = 0;
sepstack_t *p = create_sepstack();
for (i = 0; i < len; i++) {
push_sepstack(p, data[i]);
}
while (!is_empty_sepstack(p)) {
res = pop_sepstack(p);
printf("%c", res);
}
printf("\n");
return 0;
}
运行结果
I love china
学习心得
C语言中的数据结构,实践练习了单向循环链表,感觉很有收获。