用vector写一个队列
时间: 2024-05-01 20:23:25 浏览: 18
以下是一个基于 vector 实现的队列:
```cpp
#include <vector>
template <typename T>
class Queue {
public:
Queue() {}
void enqueue(const T& item) {
data_.push_back(item);
}
T dequeue() {
if (empty())
throw std::out_of_range("Queue is empty");
T item = data_.front();
data_.erase(data_.begin());
return item;
}
bool empty() const {
return data_.empty();
}
size_t size() const {
return data_.size();
}
private:
std::vector<T> data_;
};
```
在上面的实现中,我们使用 vector 存储队列中的元素。enqueue() 函数将元素添加到 vector 的末尾,而 dequeue() 函数则从 vector 的开头删除元素。empty() 和 size() 函数分别返回队列是否为空和队列中元素的数量。
相关问题
用两个vector实现一个队列,C++
++版的实现方式是什么?
你好!感谢你向我提出问题。针对你的问题,我们可以采用以下方式实现用两个vector实现一个队列的C++版本:
```c++
#include<iostream>
#include<vector>
using namespace std;
class Queue {
private:
vector<int> in_stack;
vector<int> out_stack;
public:
Queue() {}
void push(int x) {
in_stack.push_back(x);
}
int pop() {
if (out_stack.empty()) {
while (!in_stack.empty()) {
out_stack.push_back(in_stack.back());
in_stack.pop_back();
}
}
int x = out_stack.back();
out_stack.pop_back();
return x;
}
bool empty() {
return in_stack.empty() && out_stack.empty();
}
int size() {
return in_stack.size() + out_stack.size();
}
};
int main() {
Queue q;
q.push(1);
q.push(2);
q.push(3);
cout << q.pop() << endl;
cout << q.pop() << endl;
cout << q.pop() << endl;
return 0;
}
```
在上述代码中 Queue 类中包含两个 vector 类型的变量:in_stack 和 out_stack。其中 in_stack 代表队列的输入栈,out_stack 代表队列的输出栈。队列中的每个元素都是先从 in_stack 中 push 进去,但是当需要 pop 元素时,则将 in_stack 中的元素全部倒入 out_stack 中,并从 out_stack 中 pop 出栈顶元素,即为队列的头元素。
需要注意的是,当 out_stack 不为空时,直接从 out_stack 中 pop 元素,而不必将 in_stack 中的元素全部倒入 out_stack 中,从而大大提高了代码的效率。
希望我的解答对你有所帮助。如果你有其他问题,欢迎继续向我提问。
C++写一个读写操作内存的队列代码
以下是一个简单的读写操作内存的队列代码示例,其中使用了STL中的queue容器和vector容器:
```cpp
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
// 定义一个内存块结构体
struct MemoryBlock {
int size;
char* data;
};
// 定义一个内存队列类
class MemoryQueue {
public:
// 构造函数
MemoryQueue(int blockNum, int blockSize) {
// 初始化内存池
for (int i = 0; i < blockNum; i++) {
MemoryBlock block;
block.size = blockSize;
block.data = new char[blockSize];
freeBlocks.push(block);
}
}
// 析构函数
~MemoryQueue() {
// 释放所有内存块
while (!freeBlocks.empty()) {
MemoryBlock block = freeBlocks.front();
freeBlocks.pop();
delete[] block.data;
}
while (!usedBlocks.empty()) {
MemoryBlock block = usedBlocks.front();
usedBlocks.pop();
delete[] block.data;
}
}
// 从内存池中获取一个内存块
MemoryBlock allocate() {
if (freeBlocks.empty()) {
// 内存池中没有空闲块,需要从已使用块中获取
MemoryBlock block = usedBlocks.front();
usedBlocks.pop();
return block;
} else {
// 内存池中有空闲块,直接返回
MemoryBlock block = freeBlocks.front();
freeBlocks.pop();
usedBlocks.push(block);
return block;
}
}
// 归还一个内存块到内存池中
void deallocate(MemoryBlock block) {
usedBlocks.pop();
freeBlocks.push(block);
}
private:
queue<MemoryBlock> freeBlocks; // 空闲内存块队列
queue<MemoryBlock> usedBlocks; // 已使用内存块队列
};
int main() {
// 初始化内存队列
MemoryQueue memQueue(10, 1024);
// 从内存队列中获取一个内存块
MemoryBlock block = memQueue.allocate();
cout << "allocate a memory block of size " << block.size << endl;
// 对内存块进行读写操作
for (int i = 0; i < block.size; i++) {
block.data[i] = i % 256;
}
// 将内存块归还到内存队列中
memQueue.deallocate(block);
cout << "deallocate the memory block" << endl;
return 0;
}
```
上述代码中,定义了一个MemoryBlock结构体,表示内存块的大小和数据。定义了一个MemoryQueue类,表示内存队列,其中包含了两个队列:freeBlocks表示空闲内存块队列,usedBlocks表示已使用内存块队列。在构造函数中,初始化了一个内存池,即一系列空闲内存块,可以通过allocate函数从内存池中获取一个内存块,使用完毕后再通过deallocate函数归还到内存池中。在main函数中,演示了从内存队列中获取一个内存块、进行读写操作、归还内存块的过程。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![text/x-java](https://img-home.csdnimg.cn/images/20210720083646.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)