数据结构之队列

顺序栈

两栈共享空间:对于两个相同数据类型的栈,可以用数组的两端作为栈低的方法来趟两个栈共享数据,从而最大化的利用数组空间   

链栈


队列:是只允许在一端进项插入操作,而在另一端进行删除操作的线性表,它是一种先进先出(First In First Out )的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。如键盘的输入到显示器上的显示就是队列的例子

顺序队列

循环队列:为了避免数组插入和删除使需要移动数据,于是引入了循环队列,使得队头和队尾可以在数组中循环变化,解决了移动数据的时间损耗

链队列

.循环队列是事先申请好空间,使用期间释放,链队栈,每次申请和释放结点也会存在一些时间开销。在可以确定队列的最大值的情况下,建议用循环队列

#include<stdio.h>
#define size 5
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int Status ;
typedef int elementType;

typedef struct
{
	elementType data[size];
	int front;//头指针
	int rear;//尾指针
}sqQueue;

Status init(sqQueue *queue){//初始化队列
	queue->front = 0;
	queue->rear = 0;
	return OK;
}

int getQueueLength(sqQueue * queue){//求队列的长度,通用的是 ((rear + 0) + (size - front))%size
	return (queue->rear +size - queue->front)%size;
}

Status add(sqQueue * queue,elementType element){//在队列尾部插入元素
	if((queue->rear + 1)%size == queue->front ){//判断队列是否已满,采用的是头指针与尾指针是否相差一个
		return ERROR;
	}
	queue->data[queue->rear] = element;//rear指针向后移一位,若到最后就转到数组头部
	queue->rear = (queue->rear + 1)%size;
	return OK;
}

Status dele(sqQueue *queue,elementType *element){//队列空的判断
	if(queue->rear == queue->front){
		return ERROR;
	}
	
	*element = queue->data[queue->front];//把删除的值赋给element
	queue->front = (queue->front+ 1)%size;//若到最后则转到数组头部
	return OK;
}

void print(sqQueue *queue){//打印
	int a = queue ->front;
	int i;
	for( i = a ; i != queue->rear; a++, i = a%size ){

		printf("%d\t",queue->data[i]);
	}
	puts("");
}



void main()//测试代码
{
	sqQueue queue ;
	elementType i = 0;
	int deleteElement;


	init(&queue);
	for( ; i<4 ; i++){
		add(&queue,i);
	}
	print(&queue);

	dele(&queue,&deleteElement);
	dele(&queue,&deleteElement);

	add(&queue,7);
	print(&queue);
	add(&queue,8);
	print(&queue);
}



你可能感兴趣的:(数据结构,C语言,队列,代码实现)