什么是队列
队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为**队尾**,进行删除操作的端称为**队头**。队列中没有元素时,称为空队列。在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。
队列的特征
***特殊的线性表,先进先出(FIFO)***.
1)数据:
对于非空的队列,表头没有直接前驱,表尾没有直接后继,其它有且仅有一个直接前驱和一个直接后继。
2)操作:
只允许在表尾插入数据,在表头删除数据;
队列的顺序存储
typedef int datatype;
#define MAXSIZE 64
typedef struct
{
datatype data[MAXSIZE];
int front,rear;
}seq_queue,*seq_pqueue;
队列初始化
seq_pqueue init_seqqueue(void)
{
seq_pqueue q;
q = (seq_pqueue)malloc (sizeof(seq_queue));
if(NULL == q)
{
perror("malloc error");
exit(-1);
}
q->front = q->rear = MAXSIZE -1;
return q;
}
队列入队和出队(假溢出)
bool is_full_seqqueue(seq_pqueue q)
{
if((q->rear + 1)%MAXSIZE == q->front)
return true;
else
return false;
}
//入队
bool insert_seqqueue(datatype data,seq_pqueue q)
{
/*判断队列是否已满*/
if(is_full_seqqueue(q))
{
printf("sequeue full error");
return false;
}
q->rear = (q->rear + 1)%MAXSIZE;
q->data[q->rear] = data;
return true;
}
bool is_empty_seqqueue(seq_pqueue q)
{
if(q->rear == q->front)
return true;
else
return false;
}
//出队列
bool out_seqqueue(seq_pqueue q,datatype *D)
{
if(is_empty_seqqueue(q))
{
printf("sequeue empty error");
return false;
}
q->rear = (q->rear + 1)%MAXSIZE;
*D = q->data[q->front];
return true;
}
void show_seqqueue(seq_pqueue q)
{
int i = 0;
if(is_empty_seqqueue(q))
{
printf("sequeue empty error");
return;
}
//非空打印队列
for(i = (q->front + 1)%MAXSIZE; i != (q->rear + 1)%MAXSIZE; i++)
{
printf("%d\t", q->data[i]);
}
printf("\n");
return;
}