约瑟夫问题的实现(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