约瑟夫环-顺序表-C++

原创 2015年11月18日 11:18:59
#include <iostream>
using namespace std;

template<class T>
class SeqList
{
public:
	SeqList(int size=64);
	SeqList(T value[],int n);
	~SeqList();

	bool isEmpty();
	int length();
	T get(int i);
	bool set(int i,T x);
	friend ostream &operator<<<T>(ostream &out,SeqList<T> &list);
	void insert(int i,T x);
	void insert(T x);
	bool remove(int i,T &old);
	void clear();

private:
	T *element;
	int size;
	int len;
};

template<class T>
SeqList<T>::SeqList(int size)
{
	this->size=size<64?64:size;
	this->element=new T[this->size];
	this->len=0;
}

template<class T>
SeqList<T>::SeqList(T value[],int n)
{
	if (n>0)
	{
		this->element=new T[2*n];
		this->size=2*n;
		this->len=n;

		for(int i=0;i <n;i ++)
		{
			this->element[i]=value[i];
		}
	}
}

template<class T>
SeqList<T>::~SeqList()
{
	delete []this->element;
}

template<class T>
bool SeqList<T>::isEmpty()
{
	return len==0;
}

template<class T>
int SeqList<T>::length()
{
	return len;
}

template<class T>
T SeqList<T>::get(int i)
{
	if (i >=0&&i<len)
	{
		return element[i];
	}
	return 'F';
}

template<class T>
bool SeqList<T>::set(int i,T x)
{
	if (i>=0&&i<len)
	{
		element[i]=x;
		return true;
	}
	return false;
}

template<class T>
ostream &operator<<(ostream &out,SeqList<T> &list)
{
	out<<"(";
	if (list.len>0)
	{
		out<<list.element[0];
		for (int i=1;i<list.len;i++)
		{
			out<<","<<list.element[i];
		}
	}
	out<<")\n";
	return out;
}

template<class T>
void SeqList<T>::insert(int i,T x)
{
	if (len==size)
	{
		T *temp=element;
		element=new T[size*2];
		for (int i=0;i<size;i ++)
		{
			element[i]=temp[i];
		}
		size*=2;
	}
	if (i<0)
	{
		i=0;
	}
	if (i>len)
	{
		i=len;
	}
	for (int j=len-1;j>=i;j--)
	{
		element[j+1]=element[j];
	}
	element[i]=x;
	len++;
}

template<class T>
void SeqList<T>::insert(T x)
{
	insert(len,x);
}

template<class T>
bool SeqList<T>::remove(int i,T &old)
{
	if (len>0&&i>=0&&i<len)
	{
		old=element[i];
		for (int j=i;j<len;j++)
		{
			element[j]=element[j+1];
		}
		len--;
		return true;
	}
	return false;
}

template<class T>
void SeqList<T>::clear()
{
	len=0;
}

#include "SeqList.h"
#include <iostream>
using namespace std;

void josephus(int number,int start,int distance)
{
	SeqList<char> jose(number);
	int i=0;
	for (i=0;i<number;i++)
	{
		jose.insert('A'+i);
	}
	cout<<"约瑟夫环("<<number<<","<<start<<","<<distance<<"),"<<jose;

	i=start;
	while (jose.length()>1)
	{
		i=(i+distance-1)%jose.length();
		char old;
		if (jose.remove(i,old))
		{
			cout<<"删除"<<old<<",";
		}
		cout<<jose;
	}
	cout<<"被赦免者是"<<jose.get(0)<<"\n";
}

int main()
{
	josephus(5,0,2);
	system("pause");
	return 0;
}


两种方法实现约瑟夫环(链表,顺序表)

//两种方法解决约瑟夫问题:顺序存储结构,循环单链表, //测试数据:a,b,c,d,e,f,g,h,i,j,n=10;从第2个开始,数到5即:s=2,m=5 //结果f,a,g,c,j,i,b,e,...
  • TFLiu666
  • TFLiu666
  • 2017年03月27日 20:58
  • 549

约瑟夫环C++实现很经典的做法

原文地址:http://www.cnblogs.com/hanxi/archive/2012/10/10/2718413.html /* *******循环链表解决约瑟夫环问题******* * 问...
  • jzh1988903
  • jzh1988903
  • 2014年10月07日 14:52
  • 2364

约瑟夫环的问题编程C++实现

已知 n 个人(以编号1, 2, 3 ,4, 5 ,6  ... .. .n)围坐一张圆桌周围。从编号为k 的人开始报数,数到m 的那个人出列;他的下一个人又从 1开始报数,数到m的那个人又出列;依次...
  • Eagleest
  • Eagleest
  • 2012年10月19日 21:57
  • 16188

C++第15周项目3 -约瑟夫环

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijia...
  • sxhelijian
  • sxhelijian
  • 2013年06月08日 07:22
  • 6904

数据结构 约瑟夫环问题C++

需求分析 本程序是用VC编写,由于约瑟夫问题是n个人围坐在一圈,所以采用循环链表实现,又由于报数时可能循环到开始,所以采用不带头结点的循环链表结构。 题目要求的约瑟夫环操作:编号是1,2,……...
  • thf9527
  • thf9527
  • 2016年02月18日 15:41
  • 1772

约瑟夫环(C++单项循环链表)

约瑟夫问题的一种描述是:          编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报...
  • changgui5211
  • changgui5211
  • 2015年07月30日 15:19
  • 3005

C++经典题目:约瑟夫环问题

问题描述: 有n个人围成一圈,顺序排号。从第一个人开始报数(1~3报数),凡报到3的人退出圈子,问最后留下的人原来排在第几号。 分析: 首先由用户输入人数n,然后对这n个人进行编号【因为如果不编号的话...
  • QianShouYuZhiBo
  • QianShouYuZhiBo
  • 2013年09月26日 23:48
  • 3080

约瑟夫环问题-C++编程实现

原题:一组人(n)个,围成一圈,从某人开始数到滴三个的人出列,在接着从下一个人开始数,最终输出最终出列的人(约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3,...,n)分别表示)围坐在一张...
  • Evankaka
  • Evankaka
  • 2014年08月21日 19:07
  • 2793

C++面向对象方法求解约瑟夫环问题

约瑟夫问题有很多种解法及其变种,这里的约瑟夫环问题是这样的: [b]约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数...
  • u010155023
  • u010155023
  • 2015年02月14日 12:39
  • 1081

约瑟夫环C++笔试题

约瑟夫环经典问题,自己刚好学习到。记录一下,利用循环链表实现的。场景:N个人围一桌,从第k个人开始报数,报到m的人离开桌子,再从下一个人开始报数直到所有人均离开桌子。 基本思路:建立一个循环链表,不断...
  • u011584966
  • u011584966
  • 2017年01月16日 22:42
  • 139
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:约瑟夫环-顺序表-C++
举报原因:
原因补充:

(最多只允许输入30个字)