数据结构-队列篇
前言
打印机的等待任务序列,IO阻塞引起任务序列等待等等问题,体现了队列数据结构的使用方式
一、队列
概念:队列是一种只允许在一段输出而在另一端输入的一种限制性数据操作的线性表
概念模型:
队列:顺序结构存储类型
//顺序存储结构类型定义
typedef struct Queue
{
ElementType data[MAX];
int front;
int rear;
int size;
}Queue,*QueuePointer;
//入队列
bool in(QueuePointer q,ElementType ele)
{
if(q->size==MAX)return false;//满栈
q->data[q->rear--]=ele;
q->size++;
return true;
}
//出队列
bool out(QueuePointer q,ElementType ele)
{
if(q->size==0)return false;//空栈
q->data[q->front++]=ele;
q->size--;
return true;
}
//以上操作存在一个BUG
//比如 队列在经过多次出入队列之后,会存在假溢出现象,如何解决?
//假溢出:表面上表示两指针已经到达队列尾部,实际上空间并没有完全利用
//解决方式:使用链式队列进行解决或者使用循环队列即可解决此类问题
队列:链式存储结构
//数据定义类型
typedef struct node
{
ElementType data;
nodePointer next;
}node,*nodePointer;
typedef struct Queue
{
nodePointer front;
nodePointer rear;
int size;
}Queue,*queuePointer;
//初始化一个空节点作为头节点
bool init(queuePointer q)
{
q=(queuePointer)malloc(sizeof(queuePointer));
if(!q)return false;
q.front=q.rear=(nodePointer)maollc(sizeof(node));
if(!nodePointer)return false;
//temp.data=ele;
temp.next=null;
q.size=0;
}
//出队列和入队列就等同于链表的头插法固定在头部进行入队列和出队列操作
bool EnQueue(queuePointer q,ElementType *ele)
{
nodePointer temp=(nodePointer)maollc(sizeof(node));
if(!nodePointer)return false;
temp.data=ele;
temp.next=null;
//
q.rear->next=q;
q.rear=q;
q.size++;
return true;
}
bool DeQueue(queuePointer q,ElementType *ele)
{
if(q.rear==q.front)return false;
nodePointer temp=q.front->next;
*ele=q.front->data;
q.front->next=temp->next;
if(q.rear==temp)q.rear=q.front;//如果是最后一个节点
q.size--;
free(temp);
return true;
}
二、循环队列
为了解决顺序存储结构的队列出现假溢出问题,充分利用其中的空间,采用的一种存储方式
//数据结构定义方式
//实现方式存在两种
//使用顺序存储结构通常会限制容量,达不到最高存储效率
//所以采用链式结构存储空间
#define MAXSIZE 100
typedef struct
{
ElementType *base
int front;
int rear;
}queue
bool init(queue &q)
{
q.base = (QElemType * ) malloc (MAXQSIZE * sizeof(QElemType));
if ( ! Q.base) exit (OVERFLOW);//存储分配失败
.front = Q.rear = 0;
return true;
}
Status EnQueue (SqQueue &o,QElemType e){
//插入元素e为Q的新的队尾元素
if((Q.rear+ 1)% MAXQSIZE == Q.front) return ERROR;//队列满Q. base[Q.rear] = e;
Q.rear= (Q. rear + 1)% MAXQSIZE;
return OK;
}
Status DeQueue (SqQueue &o,QElemType &e){
if (Q.front = = Q.rear)return ERROR;e = Q. base[o.front];
Q.front = (Q. front + 1)% MAXQSIZE;return OK;
)
三、总结
还有双端队列 等等的使用方式,未完待续。。