约瑟夫问题的实现(c++链表版)

约瑟夫问题,感觉没什么好说的,为了这个东东百度了一波list

  List是一个双向链表,双链表既可以向前又向后链接他的元素。

    List将元素按顺序储存在链表中. 与 向量(vector)相比, 它允许快速的插入和删除,但是随机访问却比较慢。

assign() 给list赋值 

back() 返回最后一个元素 

begin() 返回指向第一个元素的迭代器 

clear() 删除所有元素 

empty() 如果list是空的则返回true 

end() 返回末尾的迭代器 

erase() 删除一个元素 

front() 返回第一个元素 

get_allocator() 返回list的配置器 

insert() 插入一个元素到list中 

max_size() 返回list能容纳的最大元素数量 

merge() 合并两个list 

pop_back() 删除最后一个元素 

pop_front() 删除第一个元素 

push_back() 在list的末尾添加一个元素 

push_front() 在list的头部添加一个元素 

rbegin() 返回指向第一个元素的逆向迭代器 

remove() 从list删除元素 

remove_if() 按指定条件删除元素 

rend() 指向list末尾的逆向迭代器 

resize() 改变list的大小 

reverse() 把list的元素倒转 

size() 返回list中的元素个数 

sort() 给list排序 

splice() 合并两个list 

swap() 交换两个list 

unique() 删除list中重复的元素

就这样 当然还有迭代器的问题,其实所谓迭代器就是各种数据结构内部的指针啦,比如l这里的list指针,可以很自由的指向其内部的各个元素,其他的比如队列之类的也有吧==我觉得==(其实我也是刚刚才懂啦!)

#include<iostream>
#include<string>
#include<cstdlib>
#include<list>
using namespace std;
 

int main()
{
	int n, k;
	while (cin >> n >> k)
	{
		list<int>table;
		list<int>::iterator s;
		for (int i = 1; i <= n; i++)
		{
			table.push_back(i);
		}
		int t = 1;
		for (s = table.begin(); table.size() != 1;)
		{
			if (t++ == k)
			{
				s = table.erase(s);
				t = 1;
			}
			else
			{
				s++;
			}
			if(s==table.end())
			{
				s = table.begin();
			}
		}
		cout << table.front();
	}
	return 0;
}//by swust_tp

全部评论

相关推荐

我是小红是我:学校换成中南
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务