队列算法的编程可以通过多种方法实现,包括顺序队列、链式队列、循环队列和双端队列等。下面我将分别介绍如何使用数组和链表来实现队列,并提供一些具体的代码示例。
使用数组实现队列
使用数组实现队列时,需要维护两个指针,一个指向队列的头部,另一个指向队列的尾部。以下是一个简单的C语言实现:
```c
include include define MAXNUM 20 typedef int DataType; struct SeqQueue { int f, r; // f是队头,r是队尾 DataType q[MAXNUM]; }; typedef struct SeqQueue *PSeqQueue; // 创建一个空队列 PSeqQueue createEmptyQueue_seq(void) { PSeqQueue paqu = (PSeqQueue)malloc(sizeof(struct SeqQueue)); paqu->f = paqu->r = -1; return paqu; } // 判队列是否为空队列 int isEmptyQueue_seq(PSeqQueue paqu) { return paqu->f == paqu->r; } // 在队列中插入一元素x void enQueue_seq(PSeqQueue paqu, DataType x) { if (paqu->r == MAXNUM - 1) { printf("Queue is full!\n"); return; } paqu->q[++paqu->r] = x; paqu->nElems++; } // 删除队列头部元素 void deQueue_seq(PSeqQueue paqu) { if (isEmptyQueue_seq(paqu)) { printf("Queue is empty!\n"); return; } paqu->f++; paqu->nElems--; } // 对非空队列,求队列头部元素 DataType frontQueue_seq(PSeqQueue paqu) { if (isEmptyQueue_seq(paqu)) { printf("Queue is empty!\n"); return -1; // 或者其他错误值 } return paqu->q[paqu->f]; } int main() { PSeqQueue queue = createEmptyQueue_seq(); enQueue_seq(queue, 1); enQueue_seq(queue, 2); enQueue_seq(queue, 3); printf("Front element: %d\n", frontQueue_seq(queue)); // 输出 1 deQueue_seq(queue); printf("Front element after dequeue: %d\n", frontQueue_seq(queue)); // 输出 2 return 0; } ``` 使用链表实现队列 使用链表实现队列时,每个元素都是一个节点,节点之间通过指针连接。以下是一个简单的C语言实现: