目录
一、前言
队列作为一种常用的结构,可以用顺序队列和链式队列实现。
1、顺序队列
2、链式队列
二,结构定义
1、顺序队列
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct { // 队列的顺序表示
int * base; // 初始化的动态分配存储空间
int front; // 头指针
int rear;; // 尾指针
}SqQueue;
2、链式队列
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct Qnode{ // 队列的链式表示
int data; // 数据域
struct Qnode * next; // 指针域
}QNode;
typedef struct{
QNode * front; // 队列头指针
QNode * rear ; // 队列尾指针
}PtrQueue;
三、相关操作
对队列的操作包括但不限于(初始化、入队列、出队列、取队头元素、求循环队列长度、销毁链式队列)
1、初始化
顺序队列初始化(循环队列)
bool InitQueue(SqQueue &Q){ // 循环队列初始化
Q.base = (int *)malloc(sizeof(int)*MAXSIZE);
if(!Q.base) // 分配空间失败
return false;
Q.front = Q.rear = 0; // 头尾指针置0,队列为空
return true;
}
链式队列初始化
bool InitQueue(PtrQueue &Q){ // 链队列初始化
Q.front = Q.rear = (QNode *)malloc(sizeof(QNode));
if(!Q.front)
return false;
Q.front = Q.rear = NULL;
return true;
}
2、入队列
循环顺序队列入队
bool InQueue(SqQueue &Q,int e){ // 循环队列入队
if((Q.rear + 1) % MAXSIZE == Q.front) // 队满
return false;
Q.base[Q.rear] = e;
Q.rear = (Q.rear + 1) % MAXSIZE;
return true;
}
链式队列入队
bool InQueue(PtrQueue &Q, int e){ // 链式队列入队
QNode * p = (QNode *)malloc(sizeof(QNode)); // 尾节点
if(!p)
return false;
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return true;
}
3、出队列
顺序循环队列出队
bool OutQueue(SqQueue &Q,int &e){ // 循环队列出队
if(Q.rear == Q.front) // 队空
return false;
e = Q.base[Q.front]; // 出队到e中
Q.front = (Q.front + 1) % MAXSIZE; // 队头指针往后循环移动
return true;
}
链式队列出队
bool OutQueue(PtrQueue &Q, int &e){ // 链式队列出队
if(Q.front == Q.rear) // 队空
return false;
QNode * p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if(Q.rear == p) // 栈中只有一个元素,出队后栈空,尾指针指向队头 *****
Q.rear = Q.front;
free(p); // 释放出掉的元素空间
return true;
}
4、取队头元素
顺序循环队列取队头元素
bool GetHead(SqQueue Q,int &e){ // 循环队列取头元素
if(Q.front == Q.rear) // 队空
return false;
e = Q.base[Q.front];
return true;
}
链式队列取队头元素
bool GetHead(PtrQueue Q,int &e){ // 链队列取队头元素
if(Q.front == Q.rear) // 队空
return false;
e = Q.front->next->data;
return true;
}
5、求循环队列长度
int QuquqLength(SqQueue Q){ // 求循环队列的长度
return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
}
6、销毁链式队列
void DestoryQueue(PtrQueue &Q){ // 销毁链式队列
while(Q.front){
Q.rear = Q.front->next; // 利用尾指针作为中介
free(Q.front); // 从前往后释放空间
Q.front = Q.rear;
}
}