ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

数据结构笔记(C++,队列的基本操作代码)

数据结构笔记(C++,队列的基本操作代码) 队列特点先进先出或者后进后出主要操作1、顺序队列顺序队列有两个状态队空、队满两个操作入队、出队。定义typedef struct{ int data[MaxSize]; int front; int rear; }SqQueue;初始化void InitQueue(SqQueue qu){ qu.frontqu.rear0;//队首队尾指针重合并指向0 }判空int QueueEmpty(SqQueue qu){ if(qu.frontqu.rear)return 1;//不论队首队尾指针指向数组中的哪个位置 else return 0; //只要两者重合即为队空 }入队//先移动指针再移动元素 int enQueue(SqQueue qu,int x){ if((qu.rear1)%MaxSizequ.front)return 0;//判满满就不能入队 qu.rear(qu.rear1)%MaxSize;//若不满则先移动指针 qu.data[qu.rear]x;//再存入元素 return 1; }出队int deQueue(SqQueue qu,int x){ if(qu.frontqu.rear)return 0;//若队空则不能入队 qu.front(qu.front1)%MaxSize;//若队不空先移动指针 xqu.data[qu.front]; return 1; }提醒这些函数在考研程序题中并不实用需要在题目中提取其中有用的操作。2、链队链队的特点是不存在队列满上溢的情况这里用单链表实现。两个状态队空、队满两个操作入队、出队。节点定义typedef struct QNode{ int data; struct QNode *next; }QNode;类型定义typedef struct{ QNode *front; QNode *rear; }LiQueue;初始化int InitQueue(LiQueue *lqu){ lqu(LiQueue*)malloc(sizeof(LiQueue)); lqu-frontlqu-rearNULL; }判空int QueueEmpty(LiQueue *lqu){ if(lqu-rearNULL||lqu-frontNULL)return 0; else return 1; }入队void enQueue(LiQueue *lqu,int x){ QNode *p; p(QNode*)malloc(sizeof(QNode)); p-datax; p-nextNULL; if(lqu-rearNULL){ //若队列为空 lqu-frontlqu-rearp;//则新结点是队首结点也是队尾结点 } else { lqu-rear-nextp;//否则将新结点链接到队尾rear指向它 lqu-rearp; } }出队int deQueue(LiQueue *lqu,int x){ QNode *p; if(lqu-rearNULL)return 0;//队空不能出栈 else{ plqu-front; } if(lqu-frontlqu-rear){//队列中只有一个结点时的出队操作需要特殊处理 lqu-frontlqu-rearNULL; } else{ lqu-frontlqu-front-next; } xp-data; free(p); return 1; }提醒1以上算法不需要记忆读懂并能够理解即可2考研中尽量用顺序队列避免用链队除非明确规定。假溢出什么是假溢出假溢出是指队列用的空间还未满但尾指针却移动到末尾不能继续入队的现象。如何解决假溢出1直接申请一块足够大的数组让rear永远不会触达数组尾部。2每当出队把队列中所有有效元素整体向前移动让front始终保持在数组下标 0 的位置。3把一维数组逻辑上看成环形利用取模运算%当rear走到数组末尾时绕回到数组开头复用前面闲置的空间循环队列方法队空frontrear队满(rear1)%Mfront。
返回列表