数据结构之顺序循环队列
順序循環(huán)隊(duì)列
- 思維導(dǎo)圖:
- 隊(duì)列的定義:
- 隊(duì)列的特點(diǎn)
- 隊(duì)列的基本操作:
- 順序循環(huán)隊(duì)列基本操作的實(shí)現(xiàn):
- 情況一:rear和front指向同一位置時(shí)
- 隊(duì)列定義:
- 隊(duì)列初始化:
- 入隊(duì):
- 出隊(duì):
- 隊(duì)列判空:
- 返回隊(duì)頭元素:
- 情況二:rear在front后面
- 隊(duì)列定義:
- 隊(duì)列初始化:
- 入隊(duì):
- 出隊(duì):
- 隊(duì)列判空:
- 返回隊(duì)頭元素:
思維導(dǎo)圖:
隊(duì)列的定義:
隊(duì)列依舊是一種特殊的線性表。但是它只允許在一端進(jìn)行插入,在另一端進(jìn)行刪除操作。
隊(duì)列的特點(diǎn)
FIFO:first in first out隊(duì)列的基本操作:
初始化隊(duì)列:InitQueue(&Q)銷毀隊(duì)列:DestoryQueue(&L)入隊(duì):EnQueue(&Q,x)出隊(duì):DeQueue(&Q,&x)讀隊(duì)頭元素:GetHead(s,&x)判空棧:QueueEmpty(S)順序循環(huán)隊(duì)列基本操作的實(shí)現(xiàn):
情況一:rear和front指向同一位置時(shí)
隊(duì)列定義:
1.用犧牲一個(gè)節(jié)點(diǎn)為代價(jià)判斷空和滿
typedef struct{int data[MaxSize];int front,rear; }SqQueue;2.用size標(biāo)記判斷空和滿
typedef struct{int data[MaxSize];int front,rear;int size; //size為0則空,size為MaxSize則滿 }SqQueue;3.用tag標(biāo)記判斷空和滿
typedef struct{int data[MaxSize];int front,rear;int tag; //入隊(duì)為1,出隊(duì)為0 }SqQueue;隊(duì)列初始化:
1.用犧牲一個(gè)節(jié)點(diǎn)為代價(jià)判斷空和滿
void InitQueue(SqQueue &Q){Q.rear = Q.front = 0; }2.用size標(biāo)記判斷空和滿
void InitQueue(SqQueue &Q){Q.rear = Q.front = 0;size = 0; }3.用tag標(biāo)記判斷空和滿
void InitQueue(SqQueue &Q){Q.rear = Q.front = 0;tag = 0; }入隊(duì):
1.用犧牲一個(gè)節(jié)點(diǎn)為代價(jià)判斷空和滿
ps: 計(jì)算隊(duì)列元素個(gè)數(shù):
(rear+MaxSize-front) % MaxSize
eg:(2+10-3) % 10 = 9(上圖)
2.用size標(biāo)記判斷空和滿
3.用tag標(biāo)記判斷空和滿
出隊(duì):
1.用犧牲一個(gè)節(jié)點(diǎn)為代價(jià)判斷空和滿
2.用size標(biāo)記判斷空和滿
3.用tag標(biāo)記判斷空和滿
隊(duì)列判空:
1.用犧牲一個(gè)節(jié)點(diǎn)為代價(jià)判斷空和滿
bool QueueEmpty(SqQueue Q){if(Q.rear == Q.front)return true;elsereturn false; }2.用size標(biāo)記判斷空和滿
bool QueueEmpty(SqQueue Q){if(Q.size == MaxSize)return true;elsereturn false; }3.用tag標(biāo)記判斷空和滿
bool QueueEmpty(SqQueue Q){if(Q.front == Q.rear && tag == 1)return true;elsereturn false; }返回隊(duì)頭元素:
1.用犧牲一個(gè)節(jié)點(diǎn)為代價(jià)判斷空和滿
bool GetHead(SqQueue &Q,int &x){if(Q.rear == Q.front)return false;x = Q.data[Q.front];return true; }2.用size標(biāo)記判斷空和滿
bool GetHead(SqQueue &Q,int &x){if(Q.size == 0)return false;x = Q.data[Q.front];return true; }3.用tag標(biāo)記判斷空和滿
bool GetHead(SqQueue &Q,int &x){if(Q.front == Q.rear && tag == 0)return false;x = Q.data[Q.front];return true; }情況二:rear在front后面
隊(duì)列定義:
1.用犧牲一個(gè)節(jié)點(diǎn)為代價(jià)判斷空和滿
typedef struct{int data[MaxSize];int front,rear; }SqQueue;2.用size標(biāo)記判斷空和滿
typedef struct{int data[MaxSize];int front,rear;int size; }SqQueue;3.用tag標(biāo)記判斷空和滿
typedef struct{int data[MaxSize];int front,rear;int tag; }SqQueue;隊(duì)列初始化:
1.用犧牲一個(gè)節(jié)點(diǎn)為代價(jià)判斷空和滿
void InitQueue(SqQueue &Q){Q.front = 0;Q.rear = (Q.front - 1) % MaxSize; }2.用size標(biāo)記判斷空和滿
void InitQueue(SqQueue &Q){Q.front = 0;Q.rear = (Q.front - 1) % MaxSize;int size; }3.用tag標(biāo)記判斷空和滿
void InitQueue(SqQueue &Q){Q.front = 0;Q.rear = (Q.front - 1) % MaxSize;int tag; }入隊(duì):
1.用犧牲一個(gè)節(jié)點(diǎn)為代價(jià)判斷空和滿
2.用size標(biāo)記判斷空和滿
bool EnQueue(SqQueue &Q,int x){if(Q.size == MaxSize)return false;Q.rear = (Q.rear + 1) % MaxSize;Q.data[Q.rear] = x;size ++;return true; }3.用tag標(biāo)記判斷空和滿
bool EnQueue(SqQueue &Q,int x){if((Q.rear+1) % MaxSize == Q.front && tag == 1)return false;Q.data[Q.rear] = x;Q.rear = (Q.rear + 1) % MaxSize;tag = 1;return true; }出隊(duì):
1.用犧牲一個(gè)節(jié)點(diǎn)為代價(jià)判斷空和滿
2.用size標(biāo)記判斷空和滿
bool DeQueue(SqQueue &Q,int &x){if(Q.size == 0)return false;Q.front = (Q.front + 1) % MaxSize;x = Q.data[Q.front];size --;return true; }3.用tag標(biāo)記判斷空和滿
//每次刪除操作成功時(shí)都令tag=0,只有刪除操作才可能導(dǎo)致隊(duì)空 //每次插入操作成功時(shí)都令tag=1,只有插入操作才可能導(dǎo)致隊(duì)滿 bool EnQueue(SqQueue &Q,int x){if((Q.rear+1) % MaxSize == Q.front && tag == 0)return false;Q.front= (Q.front+ 1) % MaxSize;x = Q.data[Q.rear];tag = 0;return true; }隊(duì)列判空:
1.用犧牲一個(gè)節(jié)點(diǎn)為代價(jià)判斷空和滿
bool QueueEmpty(SqQueue Q){if((Q.rear+1) % MaxSize == Q.front)return true;elsereturn false; }2.用size標(biāo)記判斷空和滿
bool QueueEmpty(SqQueue Q){if(Q.size == MaxSize)return true;elsereturn false; }3.用tag標(biāo)記判斷空和滿
bool QueueEmpty(SqQueue Q){if((Q.rear+1) % MaxSize == Q.front && tag == 0 )return true;elsereturn false; }返回隊(duì)頭元素:
1.用犧牲一個(gè)節(jié)點(diǎn)為代價(jià)判斷空和滿
bool GetHead(SqQueue &Q,int &x){if((Q.rear+1) % MaxSize == Q.front)return false;x = Q.data[Q.front];return true; }2.用size標(biāo)記判斷空和滿
bool GetHead(SqQueue &Q,int &x){if(Q.size == 0)return false;x = Q.data[Q.front];return true; }3.用tag標(biāo)記判斷空和滿
bool GetHead(SqQueue &Q,int &x){if((Q.rear+1) % MaxSize == Q.front && tag == 0)return false;x = Q.data[Q.front];return true; } 新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的数据结构之顺序循环队列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UIKit结构图
- 下一篇: Origin使用手册/笔记第二部分:数据