数据结构--队列

文章目录

队列

队列存储结构特点

(1)队列中的数据元素遵循“先进先出”的原则
(2)在队尾添加元素,在队头删除元素。

队列的相关概念:

(1)队头与队尾: 允许元素插入的一端称为队尾,允许元素删除的一端称为队头;
(2)入队:队列的插入操作;
(3)出队:队列的删除操作。

队列的操作:

(1)入队: 通常命名为push()
(2)出队: 通常命名为pop()
(3)求队列中元素个数
(4)判断队列是否为空
(5)获取队首元素

队列的分类:

(1)基于数组的循环队列(循环队列)
(2)基于链表的队列(链队列)
数据结构--队列
数据结构--队列
数据结构--队列

数组实现

#include <stdio.h>
#include <string.h>

#define QUE_SIZE 10  //最大队列长度+1 ,实际长度为9

typedef struct QueueInfo
{
	int front; //队头
	int tail;//队尾
	int queueArr[QUE_SIZE];

}QUEUE;

//判断队列是否为满

int QueueIsFull(QUEUE *queue)
{
	if ((queue->tail+2)% QUE_SIZE == queue->front) //队列满的条件
	{
		printf("queue is full\n");
		return -1;
	}

	else //队列不为满
		return 0;

}

//判断队列是否为空

int QueueIsEmpty(QUEUE *queue)
{
	if ((queue->tail + 1) % QUE_SIZE == queue->front) //为空的条件
	{
		printf("queue is empty\n");
		return -1;
	}

	else
		return 0;
}

//入队

int QueueInsert(QUEUE *queue, int value)
{
	if (QueueIsFull(queue)) //如果尾部入队失败,即队列已满
		return -1;

	queue->tail = (queue->tail+1)%QUE_SIZE;//更新队尾元素
	queue->queueArr[queue->tail] = value; //插入新的队尾元素

	printf("insert %d  to %d\n",value,queue->tail);	

	return 0;
}

//出队

int QueueDelete(QUEUE * queue, int *value)
{
	if (QueueIsEmpty(queue))
		return -1;

		*value = queue->queueArr[queue->front];//删除头存放在value中
		 printf("delete value from front %d  is %d\n",queue->front,*value);
		queue->front = (queue->front + 1)%QUE_SIZE;//更新头指针		

		return 0;
}


int main(int argc, char const *argv[])
{
	
	int value = 0;
	int i = 0;
	int j = 0;
	QUEUE queue;

    memset(&queue,0,sizeof(queue));
    queue.front = 1;
    queue.tail = 0;

    //假设入队位12个数据,则只有前10个在队内,剩下3个入队失败
    for (i = 0; i < 12; i ++)
    	QueueInsert(&queue,i);

    for (i = 0; i < 12; i++) //出队数据,最后3个出队失败
    	QueueDelete(&queue,&i);

	return 0;
}


链表实现

#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
    int data;
    struct Node *next;
}Qnode;
typedef struct 
{
    Qnode *front;//指向链表头结点 
    Qnode *rear;//指向链表尾结点 
}Q;

int deleteQ(Q *q)//删除结点并返回删除结点的值 
{
    Qnode *temp;
    int term;
    if(q->front == NULL)
    {
        printf("队列空!\n");
        return 0;
    }

    temp = q->front;//保留头结点 
    if(q->front == q->rear)//若队列只有一个元素 
    q->front = q->rear = NULL;//将头结点尾结点都设为空 
    else
    q->front = q->front->next;//否则改变头结点
    term = temp->data; 
    free(temp);//释放头结点 
    return term;//返回头结点的值 
}

void AddQ(Q *q,int num)//增添结点 
{
    Qnode *p = (Qnode *)malloc(sizeof(Qnode));
    p->data = num;
    Qnode *temp = q->rear;
    if(temp != NULL)//判断队列是否为空 
    {
        temp->next = p;
        q->rear = p;
        p->next = NULL;
    }
    else
    {
        q->front =  p;//若队列为空,将首尾均指向新增结点 
        q->rear = p;
        p->next = NULL;
    }
} 
int main()
{
    Q *q =(Q *) malloc(sizeof(Q));
    q->front = q->rear = NULL; 
    for(int i = 0;i < 2;i++)
    {
        AddQ(q,i);
    }
    for(int i = 0;i<2;i++)
    {
        int n = deleteQ(q);
        printf("%d\t",n);
    }
    free(q);
    return 0;
}

上一篇:数据结构笔记——队列


下一篇:10.3