在用一维数组构成的循环队列Q 中,元素出队列时和入队列时Q.front和Qrear需要作何操作
时间: 2023-07-24 16:50:17 浏览: 148
在循环队列Q中,出队列时需要将Q.front指针向后移动一个位置,即Q.front = (Q.front + 1) % MaxSize,同时将出队元素返回;入队列时需要将元素插入到Q.rear所指向的位置,然后将Q.rear指针向后移动一个位置,即Q.rear = (Q.rear + 1) % MaxSize。如果队列已满,则无法插入元素。
相关问题
设一维数组elem[maxSize]存放循环队列的元素,同时以rear和length分别指示循环队列中的队尾位置和队列中所含元素的个数。试给出该循环队列的队空条件和队满条件,并写出相应的插入(EnQueue)和删除(DeQueue)元素的操作。
队空条件:当rear == length 时,队列为空。
队满条件:当rear == (length + 1) % maxSize 时,队列已满。
插入元素操作(EnQueue):
1. 判断队列是否已满,若已满则提示“队列已满,不能插入元素”并退出操作。
2. 将新元素插入到队尾rear所在的位置。
3. 将rear的值加一,若rear超过了数组大小maxSize,则将其置为0。
4. 将队列中元素个数length加一。
删除元素操作(DeQueue):
1. 判断队列是否为空,若为空则提示“队列为空,不能删除元素”并退出操作。
2. 取出队头元素elem[front]。
3. 将front的值加一,若front超过了数组大小maxSize,则将其置为0。
4. 将队列中元素个数length减一。
C++实现:
// 声明数组及变量
const int maxSize = 100;
int elem[maxSize];
int rear = 0; // 队尾指针
int length = 0; // 队列中元素个数
// 队空判断
bool isEmpty() {
return rear == length;
}
// 队满判断
bool isFull() {
return rear == (length + 1) % maxSize;
}
// 入队操作
void EnQueue(int value) {
if (isFull()) {
cout << "队列已满,不能插入元素" << endl;
return;
}
elem[rear] = value;
rear = (rear + 1) % maxSize;
length++;
}
// 出队操作
int DeQueue() {
if (isEmpty()) {
cout << "队列为空,不能删除元素" << endl;
return -1;
}
int value = elem[(rear - length + maxSize) % maxSize];
length--;
return value;
}
仿照栈类模版的定义,写一个队列的类模版,队列中数据的特点是“先进先出”,可以用一个一维数组来模拟一个队列,注意:栈中元素的进栈和出栈都是在栈顶进行的,而队列有所不同,元素入队列在队尾进行,元素出队列在队头进行,定义一个队列类如下所示,要求按类模版的定义格式完成成员函数的定义 template <class T> class queue { public: queue(int num); ~queue(); bool insert(T item); // 元素入队列函数 T remove(); //元素出队列函数 private: T *data; int maxCount; //队列的最大容量 int front,rear; //队头和队尾为数组下标 }; 主函数如下 int main() { queue<char> q( 3 ) ; q.insert( 'A' ) ; q.insert( 'B' ) ; q.insert( 'C' ) ; cout << q.remove() ; cout << q.remove() ; cout << q.remove() << endl; return 0; }
模版类的队列定义如下:
```cpp
template <class T>
class queue {
public:
queue(int num);
~queue();
bool insert(T item);
T remove();
private:
T* data; // 队列数据的指针
int maxCount; // 队列的最大容量
int front, rear; // 队头和队尾为数组下标
};
```
其中,构造函数和析构函数的定义如下:
```cpp
template <class T>
queue<T>::queue(int num) {
data = new T[num]; // 开辟num个T类型的空间
maxCount = num;
front = rear = 0; // 队头和队尾均为0
}
template <class T>
queue<T>::~queue() {
delete[] data;
}
```
元素入队列函数的定义如下:
```cpp
template <class T>
bool queue<T>::insert(T item) {
// 如果队列已满,插入失败
if ((rear + 1) % maxCount == front) {
return false;
}
data[rear] = item;
rear = (rear + 1) % maxCount; // 队尾下标加1
return true;
}
```
元素出队列函数的定义如下:
```cpp
template <class T>
T queue<T>::remove() {
// 如果队列为空,返回T类型的默认值
if (front == rear) {
return T();
}
T item = data[front];
front = (front + 1) % maxCount; // 队头下标加1
return item;
}
```
在主函数中,可以进行队列的测试:
```cpp
int main() {
queue<char> q(3);
q.insert('A');
q.insert('B');
q.insert('C');
cout << q.remove();
cout << q.remove();
cout << q.remove() << endl;
return 0;
}
```
输出为:
```
ABC
```
阅读全文