2018大华软件竞赛——模拟赛——第一题

1node_buffer定义了一个用于存储int型数据的缓冲器,请实现其声明的所有成员方法,并满足如下要求:
1.除非调用pop_front,否则push_back成功的数据节点不可移除;
2.不可添加给定之外的数据成员和成员方法;
输入的第一行指定用例数量T;
用例的第一行输入指定队列的最大节点数K;
用例的第二行输入指定插入的节点数量M;
用例的第三行输入指定插入的节点数值,使用空格隔开;
用例的第四行输入指定移除的节点数量N;
node_buffer中剩余的节点数据值,使用空格隔开;K > 0class node_buffer
{
public:
 // 构造函数
 // 参数: max_size 指定缓冲的最大节点数
 node_buffer(int max_size);
 
 // 析构函数
 ~node_buffer();
 
 // 从队尾插入一个数据节点
 // 参数:i 待插入节点
 // 返回值:true 插入成功
 //         false 插入失败,表示数据节点个数达到最大值
 bool push_back(int i);
 
 // 从队首移除一个数据节点
 // 返回值:true 移除成功
 //         false 移除失败,表示数据节点个数为0
 bool pop_front();
 
 // 获取队首节点值,不移除数据
 int front();
 
 // 获取队尾节点值,不移除数据
 int back();
 
 // 获取数据节点数量
 // 返回值:数据节点数量
 int size();
private:
 int* m_queue;
 int  m_max_size;
 int  m_front;
 int  m_back;
 int  m_size;
};

Input:
1
8
9
1 2 3 4 5 6 7 8 9
4

Output:
5 6 7 8

实际上是手动实现一个队列,也很简单。哎,好久没用指针了。。真的不习惯。。。


#include "iostream"
#include "algorithm"
#include "vector"
#include "string"
using namespace std;

class node_buffer
{
public:
	// 构造函数
	// 参数: max_size 指定缓冲的最大节点数
	node_buffer(int max_size);

	// 析构函数
	~node_buffer();

	// 从队尾插入一个数据节点
	// 参数:i 待插入节点
	// 返回值:true 插入成功
	//         false 插入失败,表示数据节点个数达到最大值
	bool push_back(int i);

	// 从队首移除一个数据节点
	// 返回值:true 移除成功
	//         false 移除失败,表示数据节点个数为0
	bool pop_front();

	// 获取队首节点值,不移除数据
	int front();

	// 获取队尾节点值,不移除数据
	int back();

	// 获取数据节点数量
	// 返回值:数据节点数量
	int size();
private:
	int* m_queue;
	int  m_max_size;
	int  m_front;
	int  m_back;
	int  m_size;
};

node_buffer::node_buffer(int max_size)
{
	m_max_size = max_size;
	m_queue = new int[max_size];
	m_front = 0;
	m_back = 0;
	m_size = 0;
}
node_buffer::~node_buffer()
{
	//delete[] m_queue;
}
bool node_buffer::push_back(int i)
{
	if (m_size < m_max_size)
	{
		m_back = i;
	    m_queue[m_size] = i;
		m_size++;
		return true;
	}
	else
		return false;
}

bool node_buffer::pop_front()
{
	if (m_size > 0)
	{
		m_size--;
		m_queue++;
		m_front = *m_queue;
		return true;
	}
	else
		return false;
}

int node_buffer::front()
{
	return m_front;
}

int node_buffer::back()
{
	return m_back;
}

int node_buffer::size()
{
	return m_size;
}

int main()
{
	int num;
	cin >> num;
	vector<vector<int>> res(num);
	for (int k = 0; k < num;k++)
	{
		int max_size;
		cin >> max_size;
		node_buffer nb(max_size);
		int push_num;
		cin >> push_num;
		vector<int> data(push_num, 0);
		for (int i = 0; i < push_num; i++)
			cin >> data[i];
		if (push_num > max_size)
			push_num = max_size;
		data.resize(push_num);
		for (int i = 0; i < push_num; i++)
			nb.push_back(data[i]);
		int pop_num;
		cin >> pop_num;

		if (pop_num > nb.size())
			pop_num = nb.size();
		for (int i = 0; i < pop_num; i++)
			nb.pop_front();
		int length = nb.size();
		for (int i = 0; i < length; i++)
		{
			res[k].push_back(nb.front());
			nb.pop_front();
		}
	}
	for (int i = 0; i < res.size(); i++)
	{
		for (int j = 0; j < res[i].size(); j++)
		{
			if (j == res[i].size() - 1)
				cout << res[i][j];
			else
				cout << res[i][j] << " ";
		}
		cout << endl;
	}

	while (1);
	return 0;
}
//4
//8
//9
//11 12 14 13 15 26 437 18 39
//4
//6
//8
//12 12 33 14 35 46 17 58
//3
//8
//9
//113 3122 43 1234 54 126 37 128 219
//4
//6
//8
//1313 41242 31233 413 3125 63 17 8313
//3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值