隊列的順序實現數組
#define MaxSize 10 typedef struct{ ElemType data[MaxSize]; //用靜態數組存放隊列元素 int front,rear;//隊頭指針和隊尾指針 }SqQueue; //初始化隊列 void InitQueue(SqQueue &Q){ //初始時,隊頭和隊尾指針指向0 Q.rear = Q.front = 0; } //判斷隊列是否爲空 bool QueueEmpty(SqQueue Q){ if(Q.rear == Q.front)//隊空條件 return true; else return false; } void testQueue(){ //聲明一個隊列(順序存儲) SqQueue Q; InitQueue(Q); //..... }
入隊操做ide
bool EnQueue(SqQueue &Q, ElemType x){ if((Q.rear + 1) % MaxSize == Q.front)//判斷隊滿 return false;//隊滿報錯 Q.data[Q.rear] = x;//將x插入隊尾 Q.rear = Q.rear+1;//隊尾指針後移 return true; }
就算rear==MaxSize,隊列也不必定是滿的,由於前面還有出隊的指針
循環隊列的入隊操做code
bool EnQueue(SqQueue &Q, ElemType x){ if((Q.rear + 1) % MaxSize == Q.front) return false;//隊滿報錯 Q.data[Q.rear] = x;//將x插入隊尾 Q.rear = (Q.rear+1)%MaxSize;//隊尾指針後移 return true; }
出隊操做隊列
bool DeQueue(SqQueue &Q, ElemType &x){ if(Q.rear==Q.front)//判斷隊空 return false; x = Q.data[Q.front]; Q.front = (Q.front + 1)%MaxSize; return true; } //得到隊頭元素的值,用x返回 bool GetHead(SqQueue Q, ElemType &x){ if(Q.rear == Q.front) return false; x = Q.data[Q.front]; return true; }
隊列元素個數內存
(rear+MaxSize-front)%MaxSize
方案二it
#define MaxSize 10 typedef struct{ ElemType data[MaxSize]; //用靜態數組存放隊列元素 int front,rear;//隊頭指針和隊尾指針 int size;//隊列當前的長度 }SqQueue; //插入成功 size++; //刪除成功 size--; //此時,判斷隊滿的條件爲 size == MaxSize; //判斷隊空的條件爲 size == 0;
方案三class
#define MaxSize 10 typedef struct{ ElemType data[MaxSize]; //用靜態數組存放隊列元素 int front,rear;//隊頭指針和隊尾指針 int tag;//最近進行的是刪除爲0,插入1 }SqQueue;// //每次刪除操做成功時,都令tag=0; //每次插入操做成功時,都令tag=1; //此時的隊滿條件 front == rear && tag = 1; //此時的隊空條件 front == reat && tag = 0;
其餘出題方法test
若是隊尾指針指向的是隊尾元素變量
那麼在入隊操做時
Q.rear = (Q.rear + 1)%MaxSize; Q.data[Q.rear] = x;
在初始化的時候,能夠讓front指向0,讓rear指向n-1
判空:(Q.rear+1)%MaxSize == Q.front
判滿:1.犧牲一個存儲單元 2.增長輔助變量tag或者size
隊列的鏈式實現
typedef struct LinkNode{//鏈式隊列結點 ElemType data; struct LinkNode *next;}LinkNode;typedef struct{//鏈式隊列 LinkNode *front,*rear;//隊列的隊頭和隊尾指針}LinkQueue;//初始化(帶頭結點)void InitQueue(LinkQueue &Q){ //初始時,front,rear都指向頭結點 Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode)); Q.front ->next = NULL;}//判斷隊列是否爲空(帶頭結點)bool IsEmpty(LinkQueue Q){ if(Q.front == Q.rear) return true; else return false;}//初始化(不帶頭結點)void InitQueue(LinkQueue &Q){ //初始時,front,rear都指向NULL Q.front = NULL; Q.rear = NULL;}//判空(不帶頭結點)bool IsEmpty(LinkQueue Q){ if(Q.front == NULL) return true; else return false;}
入隊
//帶頭結點 void EnQueue(LinkQueue &Q, ElemType x){ LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode)); s->data = x; s->next = NULL; Q.rear->next = s;//新結點插入到rear以後 Q.rear = s;//修改表尾指針 } //不帶頭結點 void EnQueue(LinkQueue &Q,ElemType x){ LinkNode *S = (LinkNode *)malloc(sizeof(LinkNode)); s->data = x; s->next = NULL; if(Q.front == NULL){//在空列隊中插入第一個元素 Q.front = s;//修改隊頭隊尾指針 Q.rear = s; }else{ Q.rear->next = s;//新節點插入到rear結點以後 Q.reat = s;//修改rear指針 } }
出隊
//帶頭結點 bool DeQueue(LinkQueue &Q,ElemType &x){ if(Q.front == Q.rear){ return false;//空隊 } LinkNode *p = Q.front->next; x = p->data;//用變量x返回隊頭元素 Q.front->next = p->next;//修改頭結點的next指針 if(Q.rear = p)//若這次是最後一個結點出隊 Q.rear = Q.front;//修改rear指針 free(p);//釋放結點空間 return true; } //不帶頭結點 bool DeQueue(LinkQueue &Q,ElemType &x){ if(Q.front == NULL) return false;//空隊 LinkNode *p = Q.front;//p指向這次出隊的結點 x = p->data;//用變量x返回隊頭元素 Q.front->next = p->next;//修改front指針 if(Q.rear == p){//這次是最後一個結點出隊 Q.front = NULL;//front指向NULL Q.rear = NULL;//rear指向NULL } free(p);//釋放結點空間 return true; }
隊滿的條件:鏈式存儲通常不會隊滿,除非內存不足
隊列長度:從front遍歷到rear,length++