一、栈
1. 栈的基本概念
栈是一种具有特定操作规则的线性数据结构,其元素只能在同一端进行插入和删除。栈的这一端称为“栈顶”,而与之相对的另一端则是“栈底”。栈遵循“先进后出”(LIFO,Last In, First Out)的原则,即最后进入栈的元素会最先被移除。
2. 压栈与出栈操作
栈的插入操作称为“压栈”,也就是将元素放入栈顶。而栈的删除操作则是“出栈”,即将栈顶的元素移除。栈顶是栈中唯一可以进行操作的部分,每次插入和删除都会导致栈顶的变化。
通常,栈的实现可以通过数组或者链表来完成。若使用链表来实现,双向链表和单向链表都有各自的优势和限制。特别是在单链表中,操作时需要特别注意指针方向的问题,因此推荐在实现栈时使用数组。
3. 栈的实现:C语言版
栈结构的定义 和顺序表类似,栈也有静态和动态两种实现方式,但由于静态栈灵活性不足,实际开发中通常选择使用动态栈。
栈的初始化 初始化时,栈顶指针(top)通常设为-1,表示栈为空。
栈的增容 当栈的空间不足时,需要进行动态增容,即扩大栈的容量。
进栈操作 进栈时需要处理元素的插入顺序和指针的移动。根据栈顶指针的初始值不同,插入操作的顺序也有所区别。如果栈顶指针初始化为-1,则应先移动指针再插入元素;若栈顶指针初始化为0,则应先插入元素,再移动指针。
出栈操作 出栈操作是栈中元素的移除,通常直接删除栈顶元素。
栈的清空 清空栈时,会将栈中的所有元素移除,并将栈顶指针重置为-1。
获取栈顶元素 获取栈顶元素的操作是查询栈中最上面的元素,但不进行删除。
栈内容打印 打印栈中的元素时,需要逐一输出栈内的所有数据。
4. 栈的应用栈遵循先进后出的规则,这使得它特别适用于那些需要逆序处理数据的场景,例如迷宫问题、括号匹配、表达式转换和递归问题的非递归实现等。
5. 栈的实现代码
栈的具体实现代码可以参考相关代码文件:Stack.h,Stack.c,以及test.c。
二、队列
1. 队列的基本概念
队列是一种特殊的线性数据结构,具有先进先出(FIFO,First In, First Out)的特性。队列中元素的插入操作发生在队尾,而删除操作则发生在队头。这样,最早进入队列的元素总是最先被移除。
2. 入队与出队操作
入队:是指将元素插入到队尾。
出队:是指从队头移除元素。
尽管栈也可以通过数组或链表实现,队列使用链表实现会更加高效。因为如果使用数组来实现队列,每次删除操作都需要移动其他元素,这会导致效率低下。队列通常采用单链表来实现,其中入队操作通过尾插法进行,出队操作则通过头删法完成。
3. 队列的实现:C语言版
队列结构的定义 队列通过单链表来实现,链表中的每个结点定义为QNode。队列通过两个指针front和rear分别指向队列的头结点和尾结点。
队列的初始化和销毁 在初始化时,front和rear指向队列的空状态,通常设为NULL。当队列不再使用时,需要销毁队列,释放相关内存。
入队操作 入队时,会将新元素添加到队尾,并更新尾指针。
出队操作 出队操作移除队头元素,并更新队头指针。特别地,当队列中仅剩一个元素时,出队操作需要特殊处理,这时应同时将front和rear置为空,避免发生错误。
获取队头和队尾元素 获取队头和队尾元素的操作可以通过查看front和rear指针所指向的结点来实现,而不会删除这些元素。
判断队列是否为空 判断队列是否为空通常通过检查front指针是否为NULL来完成。
队列操作接口 对于队列的各项操作,可以通过定义接口函数来进行封装,以便于用户调用。
4. 队列的应用队列广泛应用于需要保持顺序的场景,如排队系统(如银行排队、自动售票机)、生产者消费者模式和广度优先搜索等算法中。
5. 队列的实现代码
队列的实现代码可以在以下链接查看:blog./qq_39183034/article/details/113179959