C语言------栈与队列
- 一、栈定义
-
- [1.1 是什么](#1.1 是什么)
- [1.2 入栈&出栈](#1.2 入栈&出栈)
- [1.3 栈顶](#1.3 栈顶)
- [1.4 栈底](#1.4 栈底)
- 二、队列
-
- [2.1 是什么](#2.1 是什么)
- [2.2 队列的基本操作](#2.2 队列的基本操作)
- [2.3 队列的特点](#2.3 队列的特点)
- 三、具体代码
- 四、运行结果
一、栈定义
1.1 是什么
- 是一个特殊的数组或者链表,只能在一端进行插入和删除操作
- 存:将数据存入栈中,称为压栈或入栈
- 取:将数据从栈中拿走,称为弹栈或出栈,取之后该数据不再存在于栈中
1.2 入栈&出栈
- 顺序相反:最后入栈的元素最先出栈
- 先进后出(FILO - First In Last Out)
- 后进先出(LIFO - Last In First Out)
1.3 栈顶
- 数组/链表中最后一个存入的元素
- 也是第一个被取出来的元素
- 所有插入和删除操作都在栈顶进行
- 栈顶是动态变化的,随着入栈和出栈操作而移动
1.4 栈底
- 第一个被压入栈的元素所在的位置
- 最后一个被取出来的元素
- 栈底在整个栈的生命周期中位置固定不变
- 当栈为空时,栈顶和栈底重合
二、队列
2.1 是什么
- 一种特殊的数组或链表(线性表),只能在表的前端进行删除,在表的后端进行插入
- 先进先出(FIFO - First In First Out)
- 后进后出(LILO - Last In Last Out)
2.2 队列的基本操作
- 入队:在队列的尾部添加新元素
- 出队:从队列的头部移除元素
- 队头:队列中最早进入、最先被删除的元素位置
- 队尾:队列中最后进入、最后被删除的元素位置
2.3 队列的特点
- 插入操作在队尾进行,删除操作在队头进行
- 元素的处理顺序与它们进入队列的顺序完全一致
- 适用于需要按顺序处理的场景,如消息队列、任务调度等
三、具体代码
#include<stdio.h>
#include<stdlib.h>
int add(int arr[],int data,int index)
{
arr[index]=data;
}
int get(int arr[],int index)
{
int num=arr[index-1]; //把数据取出来后存到num中
arr[index-1]=NULL;
return num;
}
int put(int arr2[],int data,int count)
{
arr2[count]=data;
}
int get2(int arr2[], int count, int n)
{
int num = arr2[0];
for(int i = 0; i < count - 1; i++) {
arr2[i] = arr2[i + 1];
}
return num;
}
int main()
{
printf("请输入一个数作为数组的长度:");
int n=0;
scanf("%d",&n);
int arr[n];
int arr2[n];
int index=0;
int count=0;
while(1)
{
printf("[101]入栈\n");
printf("[102]出栈\n");
printf("[201]入队\n");
printf("[202]出队\n");
printf("[999]退出程序\n");
printf("请输操作编号:\n");
int id=0;
scanf("%d",&id);
if(id==101)
{
int data=0;
printf("请输入要存入栈中的数据:") ;
scanf("%d",&data);
add(arr,data,index);
index++;
}else if(id==102)
{
int num=get(arr,index);
printf("从栈中取出的数据是:%d\n",num);
index--;
}else if(id==201)
{
int data=0;
printf("请输入要存入队列中的数据:") ;
scanf("%d",&data);
put(arr2,data,count);
count++;
}else if(id==202)
{
int num=get2(arr2,count,n);
printf("从队列中取出的数据是;%d\n",num);
count--;
}else if(id==999)
{
exit(1);//需要添加<stdlib.h>
}
}
return 0;
}
四、运行结果

