——主要参考了中国大学MOOC数据结构课程的内容
队列(Queue):具有一定操作约束的线性表——只能在一端插入,而在另一端删除。
类型名称:队列(Queue)
数据对象集:一个有0个或多个元素的有穷线性表。
操作集:长度为MaxSize的队列Q∈Queue,队列元素item∈ElementType
- Queue CreatQueue( int MaxSize ):生成长度为MaxSize的空队列;
- int IsFullQ( Queue Q, int MaxSize ):判断队列Q是否已满;
- void AddQ( Queue Q, ElementType item ): 将数据元素item插入队列Q中;
- int IsEmptyQ( Queue Q ): 判断队列Q是否为空;
- ElementType DeleteQ( Queue Q ):将队头数据元素从队列中删除并返回。
队列的顺序存储结构通常由一个一维数组和一个记录队列头元素位置的变量front以及一个记录队列尾元素位置的变量rear组成。下面是具体的代码:
#include<stdio.h>
#define MAX 10
typedef struct NQueue* Queue;
struct NQueue{
int array[MAX];
int front;
int rear;
};
Queue createQueue(){
Queue queue = (Queue)malloc(sizeof(struct NQueue));
queue->front = 0;
queue->rear = 0;
return queue;
}
void insert(Queue queue,int data){
if((queue->rear+1)%MAX == queue->front){
printf("队列满!");
return;
}
queue->array[(++queue->rear)%MAX] = data;
}
int del(Queue queue){
if(queue->rear%MAX == queue->front){
printf("队列空!");
return -1;
}
return queue->array[(++queue->front)%MAX];
}
int main(){
Queue queue = createQueue();
int i;
for(i=0;i<10;i++){
insert(queue,i);
}
for(i=0;i<10;i++){
printf("%d ",del(queue));
}
free(queue);
return 0;
}
这个程序怎么说呢,简单,但是有一些值得注意的地方,第一个就是用数组循环存储的时候,要区分满和空这两种情况。如果都是从0到n-1,就不能,因为队列一共有n+1中情况。解决的办法就是增加标记,或者只使用n-1个位置。这里就是采用了第二种方法。
#include<stdio.h>
typedef struct node* Node;
typedef struct QNode* Queue;
struct node {
int data;
struct node* next;
};
struct QNode {
struct node* front;
struct node* rear;
};
Node createNode(int data) {
Node node = (Node)malloc(sizeof(struct node));
node->data = data;
node->next = NULL;
return node;
}
Queue createQueue() {
Queue queue = (Queue)malloc(sizeof(struct QNode));
queue->front = NULL;
queue->rear = NULL;
return queue;
}
void insert(Queue queue,int data) {
if(queue->rear == NULL) {
queue->rear = createNode(data);
queue->front = queue->rear;
} else {
queue->rear->next = createNode(data);
queue->rear = queue->rear->next;
}
}
int del(Queue queue) {
if(queue->front == NULL) {
printf("队列空!");
return -1;
}
Node node;
node = queue->front;
int data = node->data;
if(queue->front == queue->rear) {
queue->front=NULL;
queue->rear =NULL;
} else {
queue->front = node->next;
}
free(node);
return data;
}
int main() {
Queue queue = createQueue();
int i;
for(i=0; i<10; i++) {
insert(queue,i);
}
for(i=0; i<11; i++) {
printf("%d ",del(queue));
}
free(queue);
return 0;
}
这个相对来说,还是比较容易的。
PS:今天不知怎么了,竟然出现了两次把赋值和等于弄混了,结果自然很悲剧,检查了十几分钟,才发现这么一个低级的错误。