创建队列及入队出队
1.首先我们来了解什么是队列,在现实生活中我们都排过队取票吧,排在最前面的是不是可以最先完成取票离开,而后来则需要在队尾继续排队呢,在数据结构中队列就是一种先进先出 只在一头入队另一头出队的存储结构 队列也有数组及链式两中结构,而我们今天学习的就是创建链式队列
用图来让我们更直观的了解队列吧
每个队列都包含了一个两个指针 一个指向队头,一个指向队尾
让我们用代码直观的写出队列:
1.首先创建结构体变量
struct Node
{
int data;
struct Node* next;
};
2.接下来创建将要入队的结点
sturct Node* creatNode(data)
{
// 将指针-> 变量 动态内存申请
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
//初始化结点
newNode->data=data;
newNode->next=NULL;
return newNode;
}
3.创建完结点后来创建队列结构体
struct Queue
{
struct Queue* frontNode //队头指针
struct Queue* tailNode //队尾指针
int size; //队列长度
};
4-创建完队列结构体之后来创建队列
struct Queue* creatQueue()
{
//创建队就是创建一个队列的结构体变量
//通过动态内存申请将指针变为变量
struct Queue* myQueue=(struct Queue*)malloc(sizeof(struct Queue));
//初始化队列
myQueue->frontNode=myQueue->tailNode=NULL;
myQueue->size=0; //刚创建队列长度为0
return myQueue;
}
5.队列的创建也已经基本完成了现在来对队列进行操作
入队(尾插法):
void push(struct Queue* myQueue,int data)
{
//首先判断队列长度是否为0
if(myQueue->size == 0)
{
myQueue->frontNode=myQueue->tailNode=newNode;
}
else
{
//调用创造结点函数创造将要插 入的新结点
struct Node* newNode=creatNode(data);
myQueue->frontNode->next=newNode; //尾结点指针指向新结点
myQueue->frontNode=newNode; //队尾指针后移
}
myQueue->size++; //队元素加一
}
6.获取队首元素
int top(struct Queue* myQueue)
{
if(myQueue->size==0)
{
printf("队列为空,无法获取队首元素\n");
system("pause");
return myQueue->size; //输出队列长度0
}
return myQueue->frontNode->next; //输出首元素
}
7.出队(表头删除法)
void pop(struct Queue* myQueue)
{
//首先判断队列是否为空,若为空则无法出队
if(myQueue->size == 0)
{
printf("队列为空,无法出队\n");
system("pause");
return;
}
else
{
//首先找到第二个元素,第一个元素出队后第二个元素称为首结点
struct Node* nextNode=myQueue->frontNode->next;
free(myQueue->frontNode);
myQueue->frontNode=nextNode; //首指针指向第二个结点
myQueue->size--; //队列元素减一
}
}
8.再写一个判断队列是否为空的函数,在我们写栈和队列时都可以用到,又叫做万金油函数
int empty(struct Queue* myQueue)
{
if(myQueue->size == 0)
return 0;
else
return 1;
}
9.测试程序
int main()
{
//首先创建出队列
struct Queue* myQueue = creatQueue();
//入队
push(myQueue,5);
push(myQueue,2);
push(myQueue,1);
while(empty(myQueue))
{
printf("%d ",top(myQueue));
pop(myQueue); //不停的出队 打印出队列所有元素
}
printf("\n");
system("pause"); //防止闪屏
return 0;
}
到这里队列的创建及操作也就结束了,博主也是一个小白,有不正确的地方还希望大家指出嘿嘿