隊列——數組實現(循環隊列)


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime> 

using namespace std;

using ElemType = int;
const int MAXSIZE = 20;

// 隊列結構
class Queue {
public:
	ElemType data[MAXSIZE];
	int front;		// 隊首 
	int rear;		// 隊尾 
};

// 初始化隊列 
void initQueue(Queue &queue)
{
	queue.front = 0;
	queue.rear = 0;
}

// 判空:front == rear 
bool isEmpty(const Queue &queue)
{
	if (queue.front == queue.rear)
		return true;
	return false;
}

// 判滿:(rear+1) % MAXSIZE == front 
bool isFull(const Queue &queue)
{
	if (queue.front == (queue.rear+1) % MAXSIZE)
		return true;
	return false;
}

// 進隊列 
void addElem(Queue &queue, ElemType val)
{
	if (isFull(queue)) {
		cout << "queue is full...\n";
		return;
	}
	queue.data[queue.rear] = val;
	queue.rear = (queue.rear + 1) % MAXSIZE;
}

// 出隊列 
void delElem(Queue &queue)
{
	if (isEmpty(queue)) {
		cout << "queue is empty...\n";
		return;
	}
	cout << "隊首元素為" << queue.data[queue.front] << endl;
	queue.front = (queue.front + 1) % MAXSIZE;
}

// 獲取隊列長度:(rear - front) % MAXSIZE 
int getLen(const Queue &queue)
{
	return (queue.rear - queue.front) % MAXSIZE;
}

int main()
{
	Queue queue;
	int queLen = 0;
	initQueue(queue);
	queLen = getLen(queue);
	cout << "當前隊列的長度為:" << queLen << endl;
	addElem(queue, 1);
	addElem(queue, 2);
	addElem(queue, 3);
	addElem(queue, 4);
	queLen = getLen(queue);
	cout << "當前隊列的長度為:" << queLen << endl;
	delElem(queue);
	delElem(queue); 
	queLen = getLen(queue);
	cout << "當前隊列的長度為:" << queLen << endl;
}

【補充】

循環隊列隊首和隊尾的一些關系(假設隊首下標為front,隊尾下標為rear,數組長度為MAXSIZE):

  • 隊列為空:rear == front
  • 隊列為滿:(rear + 1) % MAXSIZE == front          //(基於給隊列留一個空閑位置而實現,不然和隊列為空時條件重合)
  • 隊列長度:(rear - front) % MAXSIZE


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM