队列详解——循环队列(顺序结构),链队列,循环队列(只有尾指针),字符队列(顺序结构)
来源:互联网 发布:淘宝打包能学到什么 编辑:程序博客网 时间:2024/05/06 20:04
准备写队列以下几种类型:循环队列(顺序结构),链队列,循环队列(只有尾指针),字符队列(顺序结构)
一、循环队列
循环队列存储结构
typedef int QElemType;typedef struct{ QElemType *base; int front; int rear;}SqQueue;
实现循环语句
可以把循环队列想象成一个圈
因为循环队列假如是数据能占所有位置,那么队满或者对空的语句都是front==rear,这样就不能判断了,所以需要空出一个位置出来即mansize-1个位置
插入队列实现循环语句:Q.rear=(Q.rear+1)%maxsize;
删除队头实现循环语句:Q.front=(Q.front+1)%maxsize;
判断队列满:(Q.rear+1)%maxsize==Q,front;
判空:Q.front==Q.rear;
注意:Q.front和Q.rear是指下标,例如取第一个元素值:Q.base[Q.front];
demo
#include <stdio.h>#define Maxsize 100typedef int QElemType;typedef struct{ QElemType *base; int front; int rear;}SqQueue;int count=0;SqQueue QueueInit(SqQueue s){ s.base=(QElemType *)malloc(Maxsize*sizeof(QElemType)); if(!s.base) printf("error"); else{ s.front=s.rear=0; } return s;}SqQueue InsertQueue(SqQueue s,QElemType e){ if((s.rear+1)%Maxsize==s.front) printf("error"); else{ s.base[s.rear]=e; s.rear=(s.rear+1)%Maxsize; } count++; return s;}SqQueue OutQueue(SqQueue s){ int e; if(s.rear==s.front) printf("error"); else{ e=s.base[s.front]; s.front=(s.front+1)%Maxsize; } printf("%d",e); count--; return s;}int main(){ SqQueue s,p; int e,i; s=QueueInit(s); for(i=0;i<4;i++) { s=InsertQueue(s,i+1); } p=s; for(i=0;i<count;i++) { printf("%d ",p.base[p.front]); p.front=(p.front+1)%Maxsize; } printf("\n"); s=OutQueue(s); printf("\n"); p=s; for(i=0;i<count;i++) { printf("%d ",p.base[p.front]); p.front=(p.front+1)%Maxsize; } return 0;}
二、链队列
存储结构
typedef int QElemType;typedef struct QLNode{ QElemType data; struct QLNode *next;}QNode,*QueuePtr;typedef struct{ QueuePtr front; QueuePtr rear;}LinkQueue;
demo
#include <stdio.h>#include <malloc.h>typedef int QElemType;typedef struct QLNode{ QElemType data; struct QLNode *next;}QNode,*QueuePtr;typedef struct{ QueuePtr front; QueuePtr rear;}LinkQueue;void InitQueue(LinkQueue *Q){ //printf("ss"); Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode)); // printf("ss"); Q->front->next=NULL;}void InsertQueue(LinkQueue *Q,int e){ QueuePtr p; p=(QueuePtr)malloc(sizeof(QNode)); p->data=e; p->next=NULL; Q->rear->next=p; Q->rear=p;}void OutQueue(LinkQueue *Q){ QueuePtr p; int e; if(Q->front==Q->rear) printf("error"); p=Q->front->next; e=p->data; Q->front->next=p->next; printf("%d",e); if(Q->rear==p) Q->rear=Q->front; free(p);}int main(){ LinkQueue Q; QueuePtr p; int i; //printf("s"); InitQueue(&Q); //printf("s"); for(i=0;i<4;i++) { InsertQueue(&Q,i+1); } // printf("s"); p=Q.front->next; for(i=0;i<4;i++) { printf("%d ",p->data); p=p->next; } printf("\n"); OutQueue(&Q); printf("\n"); p=Q.front->next; for(i=0;i<3;i++) { printf("%d ",p->data); p=p->next; } return 0;}
三、循环队列(只有尾指针)
这个问题即用链式存储结构
存储结构
typedef int QElemType;typedef struct Lnode{ int data; struct Lnode *next;}Node,*SqQueue;
demo
#include <stdio.h>#include <malloc.h>#define Maxsize 100typedef int QElemType;typedef struct Lnode{ int data; struct Lnode *next;}Node,*SqQueue;int count=0;SqQueue QueueInit(SqQueue rear){ rear=(SqQueue)malloc(sizeof(Node)); if(!rear) printf("error"); else{ rear->next=rear; } return rear;}SqQueue InsertQueue(SqQueue rear,QElemType e){ SqQueue p; p=(SqQueue)malloc(sizeof(Node)); p->data=e; p->next=rear->next; rear->next=p; rear=p; count++; return rear;}SqQueue OutQueue(SqQueue rear){ int e; SqQueue p; if(rear==rear->next) printf("error"); else{ p=rear->next->next; e=p->data; rear->next->next=p->next; if(rear==p) { rear=rear->next; } free(p); } printf("%d",e); count--; return rear;}int main(){ SqQueue rear,p,q; int e,i; rear=QueueInit(rear); for(i=0;i<4;i++) { rear=InsertQueue(rear,i+1); } p=rear->next->next; for(i=0;i<4;i++) { printf("%d ",p->data); p=p->next; } printf("\n"); rear=OutQueue(rear); printf("\n"); q=rear->next->next; for(i=0;i<3;i++) { printf("%d ",q->data); q=q->next; } return 0;}
四、字符队列(顺序结构)
字符队列和普通没什么区别,但最重要一点就是字符输入时,会把空格或回车也放入缓存区,导致我想输入4个字符,却只能输入两个,解决办法就是加getchar();
demo
#include <stdio.h>#define Maxsize 1000typedef char QElemType;typedef struct{ QElemType *base; int front; int rear;}SqQueue;int count=0;SqQueue QueueInit(SqQueue s){ s.base=(QElemType *)malloc(Maxsize*sizeof(QElemType)); if(!s.base) printf("error"); else{ s.front=s.rear=0; } return s;}SqQueue InsertQueue(SqQueue s,QElemType e){ if((s.rear+1)%Maxsize==s.front) printf("error"); else{ s.base[s.rear]=e; s.rear=(s.rear+1)%Maxsize; count++; } return s;}SqQueue OutQueue(SqQueue s){ char e; if(s.rear==s.front) printf("error"); else{ e=s.base[s.front]; s.front=(s.front+1)%Maxsize; count--; } printf("%c",e); return s;}int main(){ SqQueue s,p; char a; int i; int l; s=QueueInit(s); for(l=0;l<4;l++) { scanf("%c",&a); getchar();//注意 s=InsertQueue(s,a); } p=s; for(i=0;i<4;i++) { printf("%c",p.base[p.front]); p.front=(p.front+1)%Maxsize; } return 0;}
阅读全文
0 1
- 队列详解——循环队列(顺序结构),链队列,循环队列(只有尾指针),字符队列(顺序结构)
- 循环队列(顺序队列)
- 循环队列(顺序队列)
- 顺序队列(循环队列)
- java 顺序结构循环队列(源代码)
- 数据结构:队列的顺序存储结构(循环队列)
- 数据结构:队列的顺序存储结构(循环队列)
- java队列实现(顺序队列、链式队列、循环队列)
- java队列实现(顺序队列、链式队列、循环队列)
- 队列的顺序存储结构---循环队列
- 队列的顺序存储结构(循环队列)
- 队列——顺序存储结构,循环队列
- 实验四:顺序队列(循环队列)和链队列
- 顺序结构的循环队列
- 数据结构——线性结构(4)——顺序队列与循环队列的原理
- 队列——顺序存储结构及其基本运算(非循环队列)
- 队列——顺序存储结构及其基本运算(循环队列)
- 队列——顺序存储结构及其基本运算(循环队列的另一种表达方式)
- sqlite
- ionic-简单购物车
- sql语句中的left join,right join,inner join的区别
- D3D11 法线贴图(凹凸贴图)
- 实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定
- 队列详解——循环队列(顺序结构),链队列,循环队列(只有尾指针),字符队列(顺序结构)
- 如何将 Debian Linux 中的默认的 Python 版本切换为替代版本
- 克鲁斯卡尔(kruskal)法求最小生成树
- Linux系统下的用户管理及权利下放
- [贪心] 51Nod1476 括号序列的最小代价
- 一、JDK下载以及环境变量配置
- 封装类
- 搜索巨合集
- Zookeeper 本地模拟伪集群环境(一 leader 多 follower)