抽象数据类型允许用户在不了解数据类型在计算机中的表示方式的情况下操作数据类型。换句话说,就用户而言,他需要知道的只是可以对数据类型执行的操作。实现数据类型的人可以自由地更改其实现,而不会影响用户。
队列是一个线性列表,其中元素在一端添加,从另一端删除。熟悉的例子有在银行、超市、音乐会或体育赛事上排队。人们应该在后面排队从前面出去。我们希望一个队列数据结构对于模拟这些实际队列是有用的。在计算机内部也可以找到队列。可能有几个作业等待执行,它们被保留在队列中?
队列就是一种抽象数据类型。
队列的应用场景(保存暂时不用的数据或存储地址):I CPU分时系统;II 模拟打印机缓冲区;III 登录和退出人数记录;
队列可以用链表实现,也可以用数组实现:
1 用结构体来定义队列
typedef struct {int head, tail;int QA[MaxQ];} QType, *Queue;
2 队列初始化
Queue initQueue() {Queue qp = (Queue) malloc(sizeof(QType));qp -> head = qp -> tail = 0;return qp;}
3 用初始来定义一个队列变量
Queue Q = initQueue();
4 判断栈是否为空
int empty(Queue Q) {return (Q -> head == Q -> tail);}
5 入队(队尾)操作
void enqueue(Queue Q, int n) {if (Q -> tail == MaxQ - 1) Q -> tail = 0;else ++(Q -> tail);if (Q -> tail == Q -> head) {printf("Queue is full");exit(1);}Q -> QA[Q -> tail] = n;} //end enqueue
如做以下操作:
enqueue(Q,35);enqueue(Q,15);enqueue(Q,12);
6 出队(队头)操作
int dequeue(Queue Q) {if (empty(Q)) {printf("Attempt to remove from an empty queue");exit(1);}if (Q -> head == MaxQ - 1) Q -> head = 0;else ++(Q -> head);return Q -> QA[Q -> head];} //end dequeue
如做如下操作:
dequeue(Q);enqueue(Q,23);
完整代码:
#include #include #define MaxQ 10typedef struct {int head, tail;int QA[MaxQ];} QType, *Queue;Queue initQueue() {Queue qp = (Queue) malloc(sizeof(QType));qp -> head = qp -> tail = 0;return qp;}int empty(Queue Q) {return (Q -> head == Q -> tail);}void enqueue(Queue Q, int n) {if (Q -> tail == MaxQ - 1) Q -> tail = 0;else ++(Q -> tail);if (Q -> tail == Q -> head) {printf("Queue is full");exit(1);}Q -> QA[Q -> tail] = n;}int dequeue(Queue Q) {if (empty(Q)) {printf("Attempt to remove from an empty queue");exit(1);}if (Q -> head == MaxQ - 1) Q -> head = 0;else ++(Q -> head);return Q -> QA[Q -> head];}int main() {int n;Queue Q = initQueue();enqueue(Q,35);enqueue(Q,15);enqueue(Q,12);dequeue(Q);enqueue(Q,23);printf("queue: ");while (!empty(Q))printf("%d