数据结构——栈和队列

article/2025/11/7 11:30:36

目录

一、栈

1.栈的概念及结构栈

2.栈的实现

二、队列

1.队列的概念及结构队列

2.队列的实现


一、栈

1.栈的概念及结构栈

一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。不同于我们所说的栈区,栈是一种数据结构,栈区是操作系统的内容。

进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出的原则。

压栈:栈的插入操作叫做入栈,入数据在栈顶。

出栈:栈的删除操作叫做出栈,出数据也在栈顶。

相当于只能尾插尾删的顺序表

2.栈的实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些,因为数组在尾上插入数据的代价比较小。

这里只需要完全使用顺序表的增删查改的操作函数即可,包括:顺序表的初始化,扩容,尾插,尾删,判空,元素个数等,但是注意栈中的元素被使用后会立刻出栈。

stack.h

#define TYPE int
typedef struct stackzone
{TYPE* arr;int volume;int top;//top是栈顶的元素编号,相当于size(不是下标)
}stack;//初始化栈
void initstack(stack* p);//扩容
void enlarge(stack* p);//栈只能尾插数据,插入数据
void stackpush(stack* p, TYPE x);//栈也只能尾删数据,删除数据
void stackpop(stack* p);//找到栈顶的元素
TYPE stacktop(stack* p);//判断栈是否为空
bool stackempty(stack* p);//判断栈中元素的多少
int stacksize(stack* p);

 stack.c

#include"stack.h"//初始化
void InitSeqlist(SList* p)
{assert(p);p->size = 0;p->volume = 0;p->SL = NULL;
}//销毁
void destory(SList* p)
{assert(p);free(p->SL);p->size = 0;p->volume = 0;p->SL = NULL;
}//扩容
void enlarge(SList* p)
{if (p->size == p->volume)//容量与数据量相同扩容,每次扩容当前二倍大小的空间{assert(p);int newvolume = (p->volume == 0 ? 4 : 2 * p->volume);//定义一个变量保存新容量的大小,容量为0扩容4个,不为0扩容二倍TYPE* p1 = (TYPE*)realloc(p->SL, newvolume*sizeof(TYPE));//容量为0时,malloc与realloc效果相同if (p1 == NULL){perror("realloc");return;}p->SL = p1;p->volume = newvolume;}
}void Seqlist_back_push(SList* p, TYPE a)
{assert(p);enlarge(p);//函数负责在适当时负责扩容*((p->SL) + (p->size)) = a;//此时size正好是应插入位置的下标p->size++;//size 自增
}void Seqlist_front_push(SList* p, TYPE a)
{assert(p);enlarge(p);//函数负责在适当时负责扩容int i = p->size;while (i >= 0){p->SL[i] = p->SL[i - 1];//顺序表的头插需要将所有数据从后向前后挪一位i--;}*(p->SL) = a;//插入数据p->size++;//自增
}void Seqlist_back_pop(SList* p)
{assert(p);p->size--;//只需要减少有效数据的个数,自减即可
}void Seqlist_front_pop(SList* p)
{assert(p);int i = 0;for (i = 0; i < p->size - 1; i++){p->SL[i] = p->SL[i + 1];//把每一个数据从前向后挪一位}p->size--;
}void print(SList* p)
{assert(p);int i = 0;for (i = 0; i < p->size; i++){printf("%d ", p->SL[i]);}printf("\n");
}int Seqlist_search_element(SList* p, TYPE a)
{assert(p);int i = 0;for (i = 0; i < p->size; i++){if (p->SL[i] == a){return i;//找到了返回下标}}return -1;//找不到返回-1
}void Seqlist_modify_element(SList* p, size_t pos, TYPE b)
{p->SL[pos] = b;//改变某个下标对应的数据
}//顺序表在pos位置插入a
void Seqlist_insert_element(SList* p, int pos, TYPE a)//包括pos从后向前后挪一位再赋值
{assert(p);assert(pos < (p->size));enlarge(p);int i = pos;for (i = pos; i < p->size; i++){p->SL[i + 1] = p->SL[i];}p->SL[pos] = a;p->size++;
}//顺序表删除pos位置的值
void Seqlist_delete_element(SList* p, int pos)
{int i = 0;for (i = pos; i < p->size - 1;i++){p->SL[i] = p->SL[i + 1];//从前向后覆盖pos后的数据}p->size--;//自减
}

test.c

#include"stack.h"void test()
{
stack s;
stack* p = &s;
initstack(p);stackpush(p, 1);
stackpush(p, 2);
stackpush(p, 3);
stackpush(p, 4);
printf("%d\n",stacktop(p));//使用
stackpop(p);//出栈
printf("%d\n", stacktop(p));//使用
stackpop(p);//出栈
//栈在使用后就会删除
stackpop(p);
stackpop(p);
printf("%d\n",stacksize(p));stackdestory(p);}int main()
{
test();
return 0;
}

二、队列

1.队列的概念及结构队列

只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列中数据具有先进先出入的性质。

就像排队一样,有一群人在银行柜台前排队,有的办完业务离开了,就相当于出队列;又有的人在后面加入排队,相当于入队列,一头进一头出。

入队列:进行插入操作的一端称为队尾,将数据尾插即为入队列。

出队列:进行删除操作的一端称为队头,在队头删除数据即为出队列。

2.队列的实现

队列的实现队列可以数组或链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。

 这里只需要完全使用链表的增删查改的操作函数即可,包括:顺序表的初始化,尾插,头删,判空,元素个数等

queue.h

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>#define TYPE inttypedef struct QueueStructre
{int size;struct queueNode* front;struct queueNode* back;
}queue;typedef struct queueNode
{TYPE data;struct queueNode* next;
}Node;//初始化队列
void initqueue(queue* p);//初始化
void initqueue(queue* p);//初始化
void initqueue(queue* p);//队列只能尾插
void queuepush(queue* p, TYPE x);//队列只能头删
void queuepop(queue* p);//销毁
void destory(queue* p);//判断是否为空
bool QueueEmpty(queue* p);//计算元素个数
int QueueSize(queue* p); //找首元素
TYPE queuefront(queue* p);//找尾元素
TYPE queueback(queue* p);

 queue.c

#include"queue.h"//初始化队列
void initqueue(queue* p)
{p->size = 0;p->front = NULL;p->back = NULL;
}//队列只能尾插
void queuepush(queue* p, TYPE x)
{Node* newcode = (Node*)malloc(sizeof(Node));if (newcode == NULL){perror("malloc fail");return;}newcode->data = x;newcode->next = NULL;if (QueueEmpty(p)){p->front = newcode;p->back = newcode;}else{p->back->next = newcode;p->back = newcode;}p->size++;
}//队列只能头删
void queuepop(queue* p)
{if (QueueEmpty(p)){return;}else{Node* n1 = p->front;Node* n2 = n1->next;p->front = n2;free(n1);p->size--;}
}//销毁
void destory(queue* p)
{Node* cur = p->front;while (cur){Node* next = cur->next;free(cur);cur = next;}p->front = NULL;p->back = NULL;p->size = 0;
}//判断是否为空
bool QueueEmpty(queue* p)
{return (p->size == 0);
}//计算元素个数
int QueueSize(queue* p)
{return p->size;
}//找首元素
TYPE queuefront(queue* p)
{return p->front->data;
}//找尾元素
TYPE queueback(queue* p)
{return p->back->data;
}

test.c

#include"queue.h"void test1()
{queue s;queue* p = &s;initqueue(p);queuepush(p,1);queuepush(p,2);queuepush(p,3);printf("%d\n", queuefront(p));printf("%d\n", queueback(p));printf("%d\n", QueueSize(p));queuepop(p);queuepush(p, 4);printf("%d\n", queuefront(p));printf("%d\n", queueback(p));destory(p);
}int main()
{test1();return 0;
}

除此之外,还有一个特殊的循环队列,讲解如下:循环队列的实现_聪明的骑士的博客-CSDN博客


http://chatgpt.dhexx.cn/article/lkxaaikB.shtml

相关文章

C语言栈和队列的实现

✅作者简介&#xff1a;嵌入式入坑者&#xff0c;与大家一起加油&#xff0c;希望文章能够帮助各位&#xff01;&#xff01;&#xff01;&#xff01; &#x1f4c3;个人主页&#xff1a;rivencode的个人主页 &#x1f525;系列专栏&#xff1a;玩转数据结构 &#x1f4ac;推荐…

栈和队列讲解

目录 1、栈 &#xff08;1&#xff09;栈的概念及结构 &#xff08;2&#xff09;栈的实现 2、队列 &#xff08;1&#xff09;队列的概念及结构 &#xff08;2&#xff09;队列的实现 前言&#xff1a;栈和队列是在顺序表和链表的延伸&#xff0c;如果前面的顺序表和链…

栈和队列(C++)

栈的相关概念 栈是仅在表尾进行插入&#xff0c;删除操作的线性表 表尾称为栈顶Top&#xff0c;表头称为栈底Base 插入元素到栈顶&#xff0c;称为入栈&#xff1b;从栈顶删除最后一个元素&#xff0c;称为出栈 栈的运算规则&#xff1a;先进后出 一.顺序栈 顺序栈的表示 …

栈和队列的基本操作(栈和队列的区别)

数据结构中的栈与内存中的栈的不同 一、数据结构中的堆栈 在数据结构中的堆栈&#xff0c;实际上堆栈是两种数据结构&#xff1a;堆和栈。堆和栈都是一种数据项按序排列的数据结构。 1.栈就像装数据的桶或箱子 我们先从大家比较熟悉的栈说起吧&#xff0c;它是一种具有后进先…

栈和队列——python

目录 一、栈 定义一个栈 栈的应用——括号匹配问题 栈的应用——迷宫问题 二、队列 自定义队列 python队列的内置模块 队列应用——打印文件后五行 队列应用——迷宫问题 python的数据结构与算法之栈与队列 自学视频&#xff1a;bilibili路飞学城清华大学博士讲解Pyt…

栈和队列的概念

文章目录 栈、队列和双端队列栈队列双端队列Java 中的栈、队列和双端队列 单调栈和单调队列二叉堆和优先队列二叉堆优先队列 目录 栈、队列和双端队列 栈和队列是常见的数据结构。栈的特点是后进先出&#xff0c;添加元素、删除元素和查看元素都在栈顶操作。队列的特点是先进先…

栈和队列详解

文章目录 前言一、栈&#xff1a;1.栈的基本概念&#xff1a;2.如何实现栈&#xff1f;3.栈代码演示&#xff1a; 二、队列&#xff1a;1.队列的基本概念&#xff1a;2.如何实现队列&#xff1f;3.队列代码演示&#xff1a; 总结 前言 栈和队列也属于线性表&#xff0c;但是它…

【数据结构】栈和队列详细分析(全)

目录 1.前言2.栈的定义与特点2.1顺序栈的定义2.2顺序栈的操作2.3链栈的定义2.4链栈的操作 3.队列的定义与特点3.1循环队列3.2循环队列的操作3.3链队的定义3.4链队的操作 4.总结 1.前言 栈和队列是两种重要的线性结构。从数据结构角度看&#xff0c;栈和队列也是线性表&#xf…

【Python数据结构系列】❤️《栈(顺序栈与链栈)》——❤️知识点讲解+代码实现

灵魂拷问&#xff1a;为什么要学数据结构&#xff1f; 数据结构&#xff0c;直白地理解&#xff0c;就是研究数据的存储方式。数据存储只有一个目的&#xff0c;即为了方便后期对数据的再利用。因此&#xff0c;数据在计算机存储空间的存放&#xff0c;决不是胡乱的&#xff0c…

数据结构——栈与队列

目录 一、栈 1.栈的定义 2.栈的分类与基本操作 1. 顺序栈 2.链栈 3.栈与递归的实现 1.递归的简单描述 2.递归过程及与栈的关联 3.递归过程示意图 二.队列 1.队列的定义 2.队列的分类与基本操作 1.顺序队列 2.链队列 3.循环队列 1.假溢出 2.循环队列 3.循环队列相…

栈与队列详解

目录 申明1. 栈的定义1.1 栈的定义1.2 进栈出栈变化形式 2. 栈的抽象数据类型3. 栈的顺序存储结构及实现3.1 栈的顺序存储结构3.2 栈的顺序存储结构——进栈操作3.3 栈的顺序存储结构——出栈操作 4. 两栈共享空间5. 栈的链式存储结构及实现5.1 栈的链式存储结构5.2 栈的链式存…

栈与队列(超详细)

目录 一、栈&#xff08;Stack&#xff09;1、什么是栈&#xff1f;2、栈的常见方法3、自己实现一个栈&#xff08;底层用一个数组实现&#xff09; 二、队列&#xff08;Queue&#xff09;1、什么是队列&#xff1f;2、队列的常见方法3、队列的实现&#xff08;单链表实现&…

C语言---栈和队列

严格来说,栈和队列都属于线性表 "一对一" 栈:"先进后出" 队列: "先进先出" 栈 栈只能从一端存取,另一端是封闭的 在栈中,不论是存还是取,都必须遵循"先进后出"的原则 >栈是一种只能从表的一端存取数据,且遵循"先进后出…

数据结构与算法——栈和队列

&#x1f60a;数据结构与算法——栈和队列 &#x1f680;前言&#x1f680;栈&#xff08;satck&#xff09;&#x1f6a2;栈的定义&#x1f6a2;共享栈&#xff08;节省空间&#xff09;&#x1f6a2;栈的表示和实现&#xff08;顺序栈&#xff09;&#x1f47b;顺序栈的定义&…

数据结构:栈和队列(Stack Queue)【详解】

友情链接&#xff1a;数据结构专栏 目录 栈和队列【知识框架】 栈一、栈的基本概念1、栈的定义2、栈的常见基本操作 二、栈的顺序存储结构1、栈的顺序存储2、顺序栈的基本算法&#xff08;1&#xff09;初始化&#xff08;2&#xff09;判栈空&#xff08;3&#xff09;进栈&a…

web 移动端开发基础

web 移动端开发基础 文章目录 web 移动端开发基础了解视口相关内容meta 视口标签掌握二倍图用法物理像素 & 物理像素比多倍图二倍精灵图做法 了解移动端常见选择方案掌握移动端常见问题解决方案移动端常见的布局方式流式布局&#xff08;百分比布局&#xff09;flex 布局 -…

Web移动端

1.PC端和移动端的区别: PC端:屏幕大 用网页固定版心,要考虑浏览器兼容问题,(布局:浮动&#xff0b;定位&#xff0b;标准流) 移动端: 手机屏幕小&#xff0c;网页宽度多数为100%&#xff0c;是适配手机屏幕宽度 移动端则基本不需要考虑兼容性问题&#xff0c;放心大胆使用CS…

移动端网页开发基础

文章目录 前言一、浏览器1.pc端常见浏览器2.移动端常见浏览器 二、视口1.布局视口layout viewport2.视觉视口visual viewport3.理想视口ideal viewport 三、二倍图1.物理像素和物理像素比2.二倍图用法 四、移动端开发选择1.单独制作移动端页面2.响应式兼容pc移动端3.移动端常见…

20.【移动端Web开发之响应式布局】

文章目录 【移动端Web开发之响应式布局】前端小抄(20)一、响应式开发1.1 响应式开发原理1.2 响应式布局容器 二、Bootstrap前端开发框架2.1 Bootstrap简介2.2 Bootstrap使用2.3 布局容器 三、Bootstrap栅格系统3.1 栅格系统简介3.2 栅格选项参数3.3 列嵌套3.4 列偏移3.5 列排序…

H5移动web开发

目录 1、H5 的新特性有哪些&#xff1f;C3 的新特性有哪些&#xff1f; 2、如何使一个盒子水平垂直居中&#xff1f; 方法一&#xff1a;利用定位&#xff08;常用方法,推荐&#xff09; 方法二&#xff1a;利用 margin:auto 方法三&#xff1a;利用 display:table-cell 方法四…