栈(数组)
1.何为
栈可以看成是一种特殊的线性表,但是这种线性表的删除与插入都只在一端进行,此处,我们称为栈顶,而不进行操作的一段称为栈底
此处我们给出栈的示意图
栈顶(top)→ [元素4] ← 最后入栈的元素
[元素3]
[元素2]
[元素1]
栈底(bottom)[元素0] ← 最先入栈的元素
此处我们可以直观知道先入栈的元素在栈底,后入栈的元素在栈顶,而元素必须先入栈才能出栈,同时元素必须在栈顶才能出栈,否则会被上面的元压着出不去,此处我们可以联想成一个有限长度的、仅允许一人进出的有限通道
此处我们就不使用伪代码示意了,直接结合C语言代码来说明
2.栈的操作
栈的操作有:入栈、出栈(退栈)、取栈顶元素、判栈空/满
2.1初始化
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10 //定义栈的最大容量
//初始化栈
typedef struct {
int data[MAX_SIZE]; // 定义存储栈元素的数组
int top; // 定义栈顶指针
} stack;
2.2入栈
if (stack.top == MAX_SIZE - 1) {
printf("栈已满,请先出栈n");
} else {
stack.data[stack.top + 1] = 1; //写入一个元素,若果想要批量写入则循环即可
stack.top++; //栈顶指针加1
printf("入栈成功n");
}
注意: 1.写入数据时务必判栈满,即对应代码if (stack.top == MAX_SIZE – 1)…,栈满则无法写入数据
- 元素入栈后务必移动栈顶指针代表栈的实际容量增加,否则会丢失数据
3.其次,我们操作时请务必使用栈顶指针,不要直接在索引上操作,否则会有一些奇奇怪怪的问题,同时也不符合栈的逻辑
2.3出栈(退栈)
if (stack.top == -1) {
printf("栈已空,请先入栈n");
} else {
printf("出栈元素为%dn", stack.data[stack.top]);
stack.top--;
}
注意: 1.出栈时务必判栈空,即对应代码if (stack.top == -1)…,栈空则无法进行出栈操作
- 出栈时务必移动栈顶指针代表栈的实际容量减少,否则会丢失数据
3.其次,我们操作时请务必使用栈顶指针,不要直接在索引上操作,否则会有一些奇奇怪怪的问题,同时也不符合栈的逻辑
(我是专业的CV程序员嘿嘿^▽^)
同时,我在学习的时候有一个疑问,我出栈不用把出去的那个元素的索引归零吗,查阅资料后得到以下回答:
不需要将出栈元素的索引位置归零,出栈操作的核心是移动栈顶指针,当栈顶指针减1后,该位置的元素在逻辑上已不在栈中,后续入栈会直接覆盖该位置的数据
2.4取栈顶元素以及遍历栈
if (stack.top == -1) {
printf("栈已空,请先入栈n");
} else {
printf("栈顶元素为%dn", stack.data[stack.top]);
printf("栈中元素个数为%dn", stack.top + 1);
printf("栈中元素为:n");
for (int i = 0; i <= stack.top; i++) {
printf("%dn", stack.data[i]);
printf("n");
}
}
注意: 1.取栈顶元素时务必判栈空,即对应代码if (stack.top == -1)…,栈空则无法进行取栈顶元素操作
2.好像没了
3.结
以上就是用数组实现栈的一些示例了,还是比较简单的,用链表来模拟栈就要头疼了(@_@;),我会尽力学习然后写出来的
完整代码可以在同文件夹下的./stackDemo1.c中找到,博客的话会把代码附在评论区
感谢支持!
评论