数据结构_4:队列:C语言
2016-01-12 21:41
323 查看
顺序队列=====假溢出
队首指针进1—Q.front=(Q.front+1)%MaxSize
队尾指针进1—Q.rear=(Q.rear+1)%MaxSize
队列长度——(Q.rear+MaxSize-Q.front)%MaxSize
出队入队:指针都顺时针进1
队满: (Q.rear+1)%MaxSize==Q.front
队空:Q.front==Q.rear
队列的元素个数: (Q.rear-Q.front+MaxSize)%MaxSize
数据结构
基本函数
/article/4722593.html
q1是专职进出栈的,q2只是个中转站
入栈:直接入队列q1即可
出栈:把q1的除最后一个元素外全部转移到队q2中,然后把刚才剩下q1中的那个元素出队列。之后把q2中的全部元素转移回q1中
循环队列
初始化—– Q.front=Q.rear=0队首指针进1—Q.front=(Q.front+1)%MaxSize
队尾指针进1—Q.rear=(Q.rear+1)%MaxSize
队列长度——(Q.rear+MaxSize-Q.front)%MaxSize
出队入队:指针都顺时针进1
判断队列是否是空
牺牲一个单元来区分对空和对满:入队时少用一个单元==对头指针在队尾指针的下一个位置作为对满的标志队满: (Q.rear+1)%MaxSize==Q.front
队空:Q.front==Q.rear
队列的元素个数: (Q.rear-Q.front+MaxSize)%MaxSize
数据结构
typedef int Status; typedef int QElemType; /* QElemType类型根据实际情况而定,这里假设为int */ /* 循环队列的顺序存储结构 */ typedef struct { QElemType data[MAXSIZE]; int front; /* 头指针 */ int rear; /* 尾指针,若队列不空,指向队列尾元素的下一个位置 */ }SqQueue;
基本函数
/* 初始化一个空队列Q */ Status InitQueue(SqQueue *Q) { Q->front=0; Q->rear=0; return OK; } /* 若队列Q为空队列,则返回TRUE,否则返回FALSE */ Status QueueEmpty(SqQueue Q) { if(Q.front==Q.rear) /* 队列空的标志 */ return TRUE; else return FALSE; } /* 返回Q的元素个数,也就是队列的当前长度 */ int QueueLength(SqQueue Q) { return (Q.rear-Q.front+MAXSIZE)%MAXSIZE; } /* 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR */ Status GetHead(SqQueue Q,QElemType *e) { if(Q.front==Q.rear) /* 队列空 */ return ERROR; *e=Q.data[Q.front]; return OK; } /* 若队列未满,则插入元素e为Q新的队尾元素 */ Status EnQueue(SqQueue *Q,QElemType e) { if ((Q->rear+1)%MAXSIZE == Q->front) /* 队列满的判断 */ return ERROR; Q->data[Q->rear]=e; /* 将元素e赋值给队尾 */ Q->rear=(Q->rear+1)%MAXSIZE;/* rear指针向后移一位置, */ /* 若到最后则转到数组头部 */ return OK; } /* 若队列不空,则删除Q中队头元素,用e返回其值 */ Status DeQueue(SqQueue *Q,QElemType *e) { if (Q->front == Q->rear) /* 队列空的判断 */ return ERROR; *e=Q->data[Q->front]; /* 将队头元素赋值给e */ Q->front=(Q->front+1)%MAXSIZE; /* front指针向后移一位置, */ /* 若到最后则转到数组头部 */ return OK; }
练习题
两个队列模拟一个栈/article/4722593.html
q1是专职进出栈的,q2只是个中转站
入栈:直接入队列q1即可
出栈:把q1的除最后一个元素外全部转移到队q2中,然后把刚才剩下q1中的那个元素出队列。之后把q2中的全部元素转移回q1中
void Push(Queue *q1, Queue *q2, int k) { EnQueue(q1, k); } int Pop(Queue *q1, Queue *q2) { int tmp; if(IsQueueEmpty(q1) == 1) { printf("Stack Empty!\n"); } else { while(SizeOfQueue(q1) != 1) { EnQueue(q2, DeQueue(q1)); } tmp = DeQueue(q1); while(IsQueueEmpty(q2) == 0) { EnQueue(q1, DeQueue(q2)); } return tmp; } }
相关文章推荐
- 17 将二叉排序树转换为有序双链表
- 浅谈PHP数据结构之栈
- 16 复杂链表的复制
- 《大话数据结构》--- 第六章 树
- 《大话数据结构》--- 第五章 串
- 数据结构学习笔记(2)
- 数据结构学习笔记(2)
- 【记录】2015/216数据结构大型实验 模拟登陆用户系统 二叉树的平衡 C++ MFC
- 开放《数据结构》专栏的代码
- 数据结构与算法——快速排序
- 数据结构
- 数据结构之图的的深度与广度优先遍历
- 数据结构之二叉排序树
- 数据结构之队列
- 树、森林与二叉树的转换总结
- 基本数据结构:链表(list)
- PE文件详解(一)--数据结构字段
- 第9章 数据结构
- 小菜一步一步学数据结构之(二)算法和算法分析
- 【Redis笔记(二)】 Redis数据结构 - string字符串