队列也一个存储同一类型数据元素的线性表但是操作受限,和栈不同的是,队列是在一端存储,在另一端删除,通俗来讲就好像你排队打饭,只能在队首打饭,在队尾排队。特点就是先进先出(FIFO),而不同于栈的先进后出。
队列的顺序实现
定义
1 2 3 4 5
| #define MaxSize 10 typedef struct{ ElemType data[MaxSizel; int front,rear; }SqQueue;
|
这里可以加入一个size来记录队列中的元素个数,便于判断队满。
初始化及判断
1 2 3 4 5 6 7 8 9 10 11 12 13
| void InitQueue(SqQueue &Q){ Q.rear=Q.front=0; }
bool QueueEmpty(SqQueue &Q){ if(Q.rear==Q.front) return true; else return false; }
|
入队操作
1 2 3 4 5 6 7 8 9
| bool EnQueue(SqQueue &Q,ElemType x){ if(队列已满) return false;
Q.data[Q.rear]=x; Q.rear=(Q.rear+1)%MaxSize; return true; }
|
取模加一是因为在队头释放掉一部分,同时队尾指针指向MaxSize时,队列实际上是没有存满的,取模加一让其重新指向对头的空闲部分。
出队操作
1 2 3 4 5 6 7 8 9
| (删除一个队头元素,并用x返回) bool DeQueue(SqQueue &Q,ElemType &x){ if(Q.rear==Q.front) return false; x=Q.data[Q.front]; Q.front=(Q.front+1)%MaxSize return true; }
|
查
1 2 3 4 5 6 7
| bool GetHead(SqQueue Q,ElemType &x){ if(Q.rear==Q.front) return false; x=Q.data[Q.front]; return true; }
|
队列的链式实现
链式实现的队列几乎和链表一样,只是限制了增删元素的方式,也就其实是一个阉割版本的链表。
定义
1 2 3 4 5 6 7
| typedef struct LinkNode{ ElemType data; struct LinkNode *next; }LinkNode; typedef struct{ LinkNode *front,*rear; }LinkQueue;
|
同样也有带头节点和不带头节点的方式,各种操作的实现方式结合链表,较简单,我这里就不再赘述了,(其实是懒得写了)。