队列的知识
来源:互联网 发布:ubuntu gcc下载 编辑:程序博客网 时间:2024/06/06 15:16
1、定义
只允许在表的一端进行插入(队尾),表的另一端进行删除(队头)的线性表
2、队列的存储结构
(1)顺序
结构定义:
由一维数组,和队尾指针(队尾元素的当前位置),队头指针(队头元素的当前位置的前一个位置)
#define maxsize 100+1
typedef int elemtype;
typedef struct
{
elemtype elem[maxsize];
int front, rear;
}cqueuetp;
为解决假溢出现象,采用循环队列,方法是取余运算
入队操作:
sq.rear=(sq.rear+1)%maxsize;
sq.elem[sq.rear]=x;
出队操作:
sq.front=(sq.front+1)%maxsize
队列的初始化操作:
void InitQueue(cqueuetp *sq)
{
sq->front = 0;
sq->rear = 0;
}
判断队列是否为空:
int QueueEmpty(cqueuetp *sq)
{
if (sq->front == sq->rear)
return 1; //返回真值
return 0;
}
求队列长度:
int Size(cqueuetp *sq)
{
return ((maxsize + sq->rear - sq->front) % maxsize); //考虑sq->rear-sq->front<0的情况
}
读取队头元素:
elemtype Head(cqueuetp *sq)
{
if (sq->front == sq->rear)
return NULL;
else
return (sq->elem[(sq->front + 1) % maxsize]); //返回队头元素值
}
入队操作:
void EnQueue(cqueuetp *sq, elemtype x)
{
if ((sq->rear + 1) % maxsize == sq->front)
printf("Overlow");
else
{
sq->rear = (sq->rear + 1) % maxsize; //插入队尾元素
sq->elem[sq->rear] = x;
}
}
出队操作:
elemtype DelQueue(cqueuetp *sq)
{
if (sq->rear == sq->front)
return NULL;
else
{
sq->front = (sq->front + 1) % maxsize;
return (sq->elem[sq->front]);
}
}
(2)链式
结构定义:
#define maxsize 100+1
typedef int elemtype;
typedef struct NODETYPE
{
elemtype data;
struct NODETYPE *next;
}nodetype;
typedef struct
{
nodetype *front;
nodetype *rear;
}lqueuetp;
队列初始化:
void InitQueue(lqueuetp *lq)
{
lq->front = (nodetype *)malloc(sizeof(nodetype)); //设置空队列lq
lq->front->next = NULL;
lq->front = lq->rear;
}
判断队空:
int QueueEmpty(lqueuetp *lq)
{
if (lq->front == lq->rear)
return 1;
return 0;
}
求队列长度:
int Size(lqueuetp *lq)
{
int i = 0;
nodetype *p = lq->front->next;
while (p)
{
i++;
p = p->next;
}
return i;
}
读取头元素值:
elemtype Head(lqueuetp *lq)
{
if (lq->front == lq->rear)
return NULL;
else
{
return lq->front->next->data;
}
}
入队操作:
void EnQueue(lqueuetp *lq,elemtype x)
{
nodetype *s;
s = (nodetype *)malloc(sizeof(nodetype));
s->data = x;
s->next = NULL;
lq->rear->next = s;
lq->rear = s;
}
出队操作:
elemtype DelQueue(lqueuetp *lq)
{
elemtype x;
nodetype *p;
if (lq->front == lq->rear)
return NULL;
else
{
p = lq->front->next;
lq->front->next = p->next;
if (p->next == NULL)
lq->rear = lq->front;
x = p->data;
free(p);
return x;
}
}
- 队列的知识
- 队列的知识
- 队列的入门知识
- 队列的知识总结
- 队列的知识
- 队列的相关知识
- 消息队列的相关知识
- 栈和队列的知识
- 循环队列的简单知识
- 消息队列的相关知识
- 队列知识
- 链和队列的知识导图
- Java知识总结----队列的使用
- 优先队列和堆的一些知识
- 优先队列相关知识
- 队列相关知识
- 循环队列相关知识
- java 队列知识整理
- POJ-2247
- 手势识别器
- Qt个性化系统托盘的实现(电脑管家)
- codeforces 567E President and Roads Dijikstra
- boost asio的异步事件处理函数是在执行异步事件的run函数所在的线程里面执行的
- 队列的知识
- [62]Unique Paths
- mac 配置sourcetree、git和phabricator环境
- ucosII实时操作系统 实现--问答》》待续
- DL:受限波尔兹曼机(RBM)能量模型
- 垃圾回收算法
- Android百分比布局:PercentFrameLayout
- 使用sLDA
- 快速开发平台ServerURL()使用介绍