catalogue
Storage mode of sequential queue
Characteristics of sequential queue storage
Definition of empty and full teams
Methods to solve false overflow
Code implementation of acyclic sequential queue
Judgment method of solving queue full by cyclic sequential queue
Cyclic sequential queue code implementation
Storage mode of sequential queue
The sequential storage structure is exactly the same as that of the general linear table. A group of storage units with continuous addresses are used to store the data elements from the head of the team to the tail of the team in turn.
Characteristics of sequential queue storage
Simple, convenient, but easy to overflow (fixed array size)
Definition of empty and full teams
front == rear It's a sign that the team is empty
rear == MAXSIZE It's a sign that the team is full.
Methods to solve false overflow
1. Move the elements in the team to the team head in turn.
2. Imagine the queue space as a circular table, that is, the m storage units allocated to the queue can be recycled. When the rear is MAXSIZE, If the beginning of the Q.front vector is empty, you can use the empty space from scratch. When front is MAXSIZE , The same is true.
The above two methods can solve the problem of false overflow, but through comparison, it can be seen that the disadvantage of the first method is a waste of time. Every time you move, the elements in the team will move, so you generally choose the second method.
Sequential queue function
bool InitQueue(SqQueue &Q); // 1. Team initialization
bool QueueEmpty(SqQueue Q); // 2. Judge whether it is empty
int QueueLength(SqQueue Q); // 3. Find the length of the team
bool DestroyQueue(SqQueue &Q); // 4. Destruction team
void ClearQueue(SqQueue &Q); // 5. Empty the sequence team
bool EnQueue(SqQueue &Q,ElemType e); // 6. Join the team
bool DeQueue(SqQueue &Q,ElemType &e); // 7. Out of the team
bool GetHead(SqQueue Q,ElemType &e); // 8. Get team leader element
Code implementation of acyclic sequential queue
#include<bits/stdc++.h> using namespace std; #define MAXSIZE 100 typedef int ElemType; typedef struct SqQueue { ElemType *base; int front; int rear; }SqQueue; //Initialize sequence queue bool InitQueue(SqQueue &Q) { Q.front = Q.rear = 0; Q.base = new ElemType[MAXSIZE]; if(!Q.base) //Storage allocation failed exit(-1); return true; } //Determine whether the queue is empty bool QueueEmpty(SqQueue Q) { if(Q.front == Q.rear) return true; return false; } //Destroy queue bool DestroyQueue(SqQueue &Q) { if(Q.base) { delete Q.base; Q.front = Q.rear = NULL; } } //Empty queue bool ClearQueue(SqQueue &Q) { if(Q.base) { Q.rear = Q.front; } } //Find queue length int QueueLength(SqQueue Q) { return Q.rear - Q.front; } //Join the team bool EnQueue(SqQueue &Q,ElemType e) { if(Q.rear == MAXSIZE) return false; Q.base[Q.rear++] = e; return true; } //Out of the team bool DeQueue(SqQueue &Q,ElemType &e) { if(Q.rear == Q.front) return false; e = Q.base[Q.front++]; return true; } //Get queue header element bool GetHead(SqQueue Q,ElemType &e) { if(Q.rear == Q.front) return false; e = Q.base[Q.front]; return true; } int main() { int n; ElemType e; SqQueue que; InitQueue(que); cout << "The queue has been initialized" << endl; cout << "Please enter the number of elements in the queue:" << endl; cin >> n; cout << "Please enter the elements in the queue in turn:" << endl; for(int i = 0; i < n; i++) { cin >> e; EnQueue(que, e); } cout << "At this time, the length of the queue is:" << QueueLength(que) << endl; cout << "Take out all elements in the queue:"; for(int i = 0; i < n; i++) { DeQueue(que, e); cout << e << " "; } cout << endl; cout << "At this time, the length of the queue is:" << QueueLength(que) << endl; cout << "Add an element to the queue:" << endl; cin >> e; EnQueue(que, e); cout << "At this time, the team head element is:" << e << endl; GetHead(que, e); cout << "At this time, the length of the queue is:" << QueueLength(que) << endl; cout << "Empty queue" << endl; ClearQueue(que); cout << "At this time, the length of the queue is:" << QueueLength(que) << endl; DestroyQueue(que); return 0; }
Cyclic sequential queue
In the above sequence teams, it is found that the space of sequence teams is sometimes not fully utilized, and there will be false overflow. In order to solve the false overflow, it is proposed to use circular sequence teams to prevent it.
As shown in the figure below, base[0] is connected to base[MAXQSIZE] - 1] After that, if rear+ 1==M, then make rear=0; A cyclic sequential queue is a cyclic use of the storage space allocated for the queue.
The way to implement the cyclic sequence team is to use the module, In C language: %) Therefore, the difference between the circular sequence team and the sequence team in the operation of inserting and deleting elements is that it needs to perform one more modular operation:
Insert element:
Q.base[Q.rear]=x;
Q.rear=(Q.rear+ 1)% MAXQSIZE;
Delete element:
x=Q.base[s.front];
Q.front=(Q.front+ 1)% MAXQSIZE
Judgment method of solving queue full by cyclic sequential queue
The problem should be found in the above figure, that is, the judgment conditions of empty and full teams are front == rear. Obviously, this is not feasible, so there are three solutions, as follows:
1. Another sign shall be set to distinguish between empty and full teams
2. Set another variable to record the number of elements
3. Use less one primeless space
Generally, the third method is adopted. Therefore, the third method is used to realize the cyclic sequence team. The diagram is as follows:
At this time, the condition of empty queue is still front == rear
The condition of full queue is (rear + 1)% maxsize = = front
Cyclic sequential queue code implementation
#include<bits/stdc++.h> using namespace std; #define MAXSIZE 10 typedef int ElemType; typedef struct SqQueue { ElemType *base; int front; int rear; }SqQueue; //Initialize cyclic sequence queue bool InitQueue(SqQueue &Q) { Q.front = Q.rear = 0; Q.base = new ElemType[MAXSIZE]; if(!Q.base) //Storage allocation failed exit(-1); return true; } //Judge whether the loop sequence queue is empty bool QueueEmpty(SqQueue Q) { if(Q.front == Q.rear) return true; return false; } //Destroy queue bool DestroyQueue(SqQueue &Q) { if(Q.base) delete Q.base; Q.base = NULL; Q.front = Q.rear = 0; } //Empty queue void ClearQueue(SqQueue &Q) { Q.rear = Q.front = 0; } //Find queue length int QueueLength(SqQueue Q) { return (Q.rear - Q.front + MAXSIZE) % MAXSIZE; } //Join the team bool EnQueue(SqQueue &Q, ElemType e) { if((Q.rear + 1) % MAXSIZE == Q.front) return false; Q.base[Q.rear] = e; Q.rear = (Q.rear + 1) % MAXSIZE; return true; } //Out of the team bool DeQueue(SqQueue &Q, ElemType &e) { if(Q.rear == Q.front) return false; e = Q.base[Q.front]; Q.front = (Q.front + 1) % MAXSIZE; return true; } //Get queue header element bool GetHead(SqQueue Q, ElemType &e) { if(Q.rear == Q.front) return false; e = Q.base[Q.front]; return true; } int main() { int n; ElemType e; SqQueue que; InitQueue(que); cout << "The queue has been initialized" << endl; cout << "Please enter the number of elements in the queue:" << endl; cin >> n; cout << "Please enter the elements in the queue in turn:" << endl; for(int i = 0; i < n; i++) { cin >> e; EnQueue(que, e); } cout << "At this time, the length of the queue is:" << QueueLength(que) << endl; cout << "Take out all elements in the queue:"; for(int i = 0; i < n; i++) { DeQueue(que, e); cout << e << " "; } cout << endl; cout << "At this time, the length of the queue is:" << QueueLength(que) << endl; cout << "Add an element to the queue:" << endl; cin >> e; EnQueue(que, e); cout << "At this time, the team head element is:" << e << endl; GetHead(que, e); cout << "At this time, the length of the queue is:" << QueueLength(que) << endl; cout << "Empty queue" << endl; ClearQueue(que); cout << "At this time, the length of the queue is:" << QueueLength(que) << endl; DestroyQueue(que); return 0; }