国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)結(jié)構(gòu)上機(jī)實(shí)驗(yàn)——棧和隊(duì)列的實(shí)現(xiàn)、棧和隊(duì)列的應(yīng)用、進(jìn)制轉(zhuǎn)換、約瑟夫環(huán)問題

這篇具有很好參考價值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu)上機(jī)實(shí)驗(yàn)——棧和隊(duì)列的實(shí)現(xiàn)、棧和隊(duì)列的應(yīng)用、進(jìn)制轉(zhuǎn)換、約瑟夫環(huán)問題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

棧和隊(duì)列上機(jī)實(shí)驗(yàn)

1.要求

??1.利用棧的基本操作實(shí)現(xiàn)將任意一個十進(jìn)制整數(shù)轉(zhuǎn)化為R進(jìn)制整數(shù)。

??2.利用循環(huán)隊(duì)列實(shí)現(xiàn).約瑟夫環(huán)問題:已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報(bào)數(shù),數(shù)到k的那個人出圈;他的下一個人又從1開始報(bào)數(shù),數(shù)到k的那個人出圈;依此規(guī)律重復(fù)下去,直到圓桌周圍的人只剩最后一個。模擬該游戲,并輸出出圈順序。

????????????

2.棧的實(shí)現(xiàn)(以順序棧為例)

??棧的基本概念:

??棧(stack)是一種數(shù)據(jù)結(jié)構(gòu),它是一種只能在一端進(jìn)行插入和刪除操作的特殊線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進(jìn)棧、入?;驂簵#前研略胤诺綏m斣氐纳厦?,使之成為新的棧頂元素;從一個棧刪除元素又稱作出?;蛲藯?,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。

??
??棧的基本結(jié)構(gòu)和初始化:

??我們定義了一個名為Stack的模板類,用于實(shí)現(xiàn)可以存儲各種數(shù)據(jù)類型的棧的數(shù)據(jù)結(jié)構(gòu)。我們創(chuàng)建了三個Stack的成員函數(shù):_base、_top 和 _size。

??_base: 它作為動態(tài)分配的棧內(nèi)存的起始位置。

??_top:表示棧頂?shù)奈恢谩?/strong> 在構(gòu)造函數(shù)中,它被初始化為指向InitStackSize個新分配的SElemType元素的數(shù)組的末尾。

??_size: 是一個整數(shù),用于表示棧的當(dāng)前大小,即棧中元素的數(shù)量。 在構(gòu)造函數(shù)中,它被初始化為InitStackSize。

??構(gòu)造函數(shù): Stack()函數(shù)負(fù)責(zé)初始化這個棧。 它首先為_base和_top分配InitStackSize個SElemType大小的內(nèi)存,并將_size設(shè)置為InitStackSize。

??析構(gòu)函數(shù): ~Stack()函數(shù)負(fù)責(zé)清理和釋放由Stack對象持有的內(nèi)存。 它首先刪除_base指向的數(shù)組,然后將_base和_top設(shè)置為0,將_size設(shè)置為0。這是為了確保在對象銷毀后,不會錯誤地引用任何內(nèi)存地址。

??注意:數(shù)據(jù)結(jié)構(gòu)的的實(shí)現(xiàn)是很靈活的,對于棧而言,順序結(jié)構(gòu)和鏈?zhǔn)浇Y(jié)構(gòu)都可以實(shí)現(xiàn),當(dāng)然,_base,_top等成員變量也可以設(shè)計(jì)成整型或者是指針,只要滿足該數(shù)據(jù)類型的特征,就都可以設(shè)計(jì)。

template<class T>
class Stack
{
	//構(gòu)造函數(shù)
	Stack()
	{
		_base = _top = new SElemType[InitStackSize];
		_size = InitStackSize;
	}

	//析構(gòu)函數(shù)
	~Stack()
	{
		delete[] _base;
		_top = _base = nullptr;
		_size = 0;
	}

private:
	SElemType* _base, * _top;
	int _size;
};

??
??入棧和擴(kuò)容操作:

??我們現(xiàn)在實(shí)現(xiàn)棧最基本的入棧操作,首先創(chuàng)建一個Push函數(shù),它用于將一個元素壓入棧中。如果棧滿了,它會進(jìn)行擴(kuò)容操作。

??如果 _top 指針和 _base 指針之間的距離等于 _size(這意味著棧已經(jīng)滿了),那么將進(jìn)行擴(kuò)容操作。擴(kuò)容操作包括創(chuàng)建一個新的數(shù)組(大小為原數(shù)組的兩倍),然后復(fù)制原數(shù)組的元素到新數(shù)組中。 最后,更新 _base 指針指向新數(shù)組,_top 指針指向新數(shù)組的末尾,_size 變?yōu)樾聰?shù)組的大小。

??入棧操作,如果棧沒有滿,那么將 val 的值賦給 _top 指針?biāo)赶虻奈恢?,并?_top 指針向前移動一位。 最后,_size 加一。

void Push(const SElemType& val)
{
	//棧滿,擴(kuò)容
	if (_top - _base == _size)
	{
		//轉(zhuǎn)移棧中的元素
		SElemType* newbase = new SElemType[_size * 2];
		for (int i = 0; i < _size; i++)
		{
			newbase[i] = _base[i];
		}

		//刪除原來?xiàng)V性?/span>
		delete[] _base;
		_base = newbase;
		_top = newbase + _size;
		_size *= 2;
	}

	//入棧操作
	*_top = val;
	_top++;
	_size++;
}

??
??出棧操作:

??我們現(xiàn)在實(shí)現(xiàn)出棧操作,先創(chuàng)建一個名為Pop的函數(shù),用于從棧中刪除并返回棧頂元素。

??函數(shù)聲明:Pop(SElemType& e) 是一個函數(shù),它接受一個類型為 SElemType 的引用作為參數(shù),命名為 e。引用的使用意味著我們可以在函數(shù)內(nèi)部修改傳入的參數(shù),而不僅僅是它的副本。

??棧檢查:在函數(shù)體中,首先檢查棧的大?。╛size),如果為0,說明棧是空的。 此時,會打印一條消息 ‘該棧為空,無法刪除\n’ 并結(jié)束函數(shù)。出棧操作:如果棧非空,我們執(zhí)行出棧操作。首先,將棧頂元素的值賦給參數(shù) e。然后,將 _top 指針向前移動一位(即向下移動到棧頂元素的前一個位置),因?yàn)槲覀円呀?jīng)取出了棧頂元素。最后,_size 減一,因?yàn)闂V猩倭艘粋€元素。

??這樣,Pop 函數(shù)就能夠從棧中刪除并返回棧頂元素,同時還能處理空棧的情況。

void Pop(SElemType& e)
{
	if (_size == 0)
	{
		cout << "該棧為空,無法刪除\n";
		return;
	}

	//出棧操作
	e = *_top;
	_top--;
	_size--;
}

??棧測試:

數(shù)據(jù)結(jié)構(gòu)上機(jī)實(shí)驗(yàn)——棧和隊(duì)列的實(shí)現(xiàn)、棧和隊(duì)列的應(yīng)用、進(jìn)制轉(zhuǎn)換、約瑟夫環(huán)問題,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c++,課程設(shè)計(jì)

????????????

3.隊(duì)列的實(shí)現(xiàn)(以順序隊(duì)列為例)

??隊(duì)列的基本概念:

??隊(duì)列是一種特殊的線性表,它只允許在表的前端(front)進(jìn)行刪除操作,而在表的后端(rear)進(jìn)行插入操作。 和棧一樣,隊(duì)列是一種操作受限制的線性表。進(jìn)行插入操作的端稱為隊(duì)尾,進(jìn)行刪除操作的端稱為隊(duì)頭。

??
??隊(duì)列的基本結(jié)構(gòu)和初始化:

??我們定義了一個名為Queue的C++模板類,用于實(shí)現(xiàn)可以存儲不同數(shù)據(jù)類型的隊(duì)列數(shù)據(jù)結(jié)構(gòu)。我們創(chuàng)建了四個成員變量:

??_base:這是一個指向隊(duì)列元素的指針。

??_front:這是隊(duì)列的頭部索引。

??_rear:這是隊(duì)列的尾部索引。

??_capacity:這是隊(duì)列的容量。

??構(gòu)造函數(shù):Queue的構(gòu)造函數(shù)初始化了隊(duì)列的基礎(chǔ)元素?cái)?shù)組。將隊(duì)列的前端和后端索引設(shè)為0,并將隊(duì)列的容量設(shè)為 ‘QueueSize’。這個 ‘QueueSize’ 應(yīng)該是在類外部定義的常數(shù),表示隊(duì)列的最大容量。

??析構(gòu)函數(shù):當(dāng) Queue 對象被銷毀時,析構(gòu)函數(shù)將被調(diào)用。 這個析構(gòu)函數(shù)刪除了隊(duì)列的基礎(chǔ)元素?cái)?shù)組,將 _base 設(shè)為 nullptr,將隊(duì)列的前端和后端索引設(shè)為0,并將隊(duì)列的容量設(shè)為0。這是為了釋放隊(duì)列占用的內(nèi)存,并重置隊(duì)列的狀態(tài)。

template<class T>
class Queue
{
public:
	//構(gòu)造函數(shù)
	Queue()
	{
		_base = new QElemType[QueueSize];
		_front = _rear = 0;
		_capacity = QueueSize;
	}

	//析構(gòu)函數(shù)
	~Queue()
	{
		delete[] _base;
		_base = nullptr;
		_front = _rear = 0;
		_capacity = 0;
	}
	
private:
	QElemType* _base;
	int _front, _rear;
	int _capacity;
};

??
??入隊(duì)和擴(kuò)容操作:

??我們現(xiàn)在實(shí)現(xiàn)隊(duì)列的入隊(duì)函數(shù),用于將一個元素添加到隊(duì)列中。

??if (_front == (_rear + 1) % _capacity): 這是一個判斷語句,它檢查隊(duì)列是否已滿。這里的_front,_rear和_capacity可能是隊(duì)列的私有成員變量。其中_front代表隊(duì)列的第一個元素的位置,_rear代表隊(duì)列的最后一個元素的位置(下一個插入元素的位置),_capacity代表隊(duì)列的最大容量。如果_front等于_rear + 1 % _capacity,這意味著隊(duì)列的下一個位置(_rear)已經(jīng)被占用了,即隊(duì)列已滿。

??擴(kuò)容:QElemType* newqueue = new QElemType[_capacity * 2];: 如果隊(duì)列已滿,這段代碼會創(chuàng)建一個新的、容量是原隊(duì)列兩倍的隊(duì)列。for (int i = _front; i < _rear; i++): 這個循環(huán)復(fù)制原隊(duì)列中從_front到_rear - 1的所有元素到新的隊(duì)列中。delete[] _base;: 釋放原隊(duì)列所占用的內(nèi)存。_base = newqueue;: 將新隊(duì)列的指針賦值給_base,這樣原隊(duì)列的指針就指向了新的隊(duì)列。然后更新隊(duì)列的容量即可。

??入隊(duì): 就在隊(duì)列的最后一個位置插入新的元素。更新隊(duì)列的最后一個位置即可。如果增加后超過了隊(duì)列的容量,則取模(%)操作會將其限制在隊(duì)列的范圍內(nèi)(0到_capacity-1)。

??順序隊(duì)列的一些操作和判斷:

??空隊(duì)列判斷條件: rear == front

??尾指針的移動方式: rear = (rear+1)%QueueSize

??頭指針的移動方式: front=(front+1)%QueueSize

??判斷隊(duì)列滿: front == (rear+1)%QueueSize

數(shù)據(jù)結(jié)構(gòu)上機(jī)實(shí)驗(yàn)——棧和隊(duì)列的實(shí)現(xiàn)、棧和隊(duì)列的應(yīng)用、進(jìn)制轉(zhuǎn)換、約瑟夫環(huán)問題,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c++,課程設(shè)計(jì)

void Push(const QElemType& val)
{
	//判斷隊(duì)列是否已滿
	if (_front == (_rear + 1) % _capacity)
	{
		QElemType* newqueue = new QElemType[_capacity * 2];
		for (int i = _front; i < _rear; i++)
		{
			newqueue[i] = _base[i];
		}

		//刪除原來?xiàng)V性?/span>
		delete[] _base;
		_base = newqueue;
		_capacity *= 2;
	}

	_base[_rear] = val;
	//如果想讓隊(duì)列超過QueueSize的長度,一定要%_capacity;
	_rear = (_rear + 1) % _capacity;
}

??
??出隊(duì)操作:

??實(shí)現(xiàn)隊(duì)列出隊(duì)操作我們先判斷隊(duì)列是否為空, 它檢查隊(duì)列的前端(_front)和后端(_rear)是否相等。如果相等,這意味著隊(duì)列為空,沒有元素可以刪除。則輸出信息直接返回,不執(zhí)行任何操作。

??如果隊(duì)列不為空,這行代碼將_base數(shù)組中索引為_front的元素賦值給引用參數(shù)e。這意味著,當(dāng)你調(diào)用Pop函數(shù)時,通過引用參數(shù)e來獲取被出隊(duì)的元素。當(dāng)元素被刪除后,前端位置需要更新以指向下一個未被刪除的元素。 這里使用模運(yùn)算符(%)來確保前端位置在超過隊(duì)列容量時回到隊(duì)列的開始位置。

void Pop(QElemType& e)
{
	if (_front == _rear)
	{
		cout << "隊(duì)列為空,無法刪除\n";
		return;
	}

	e = _base[_front];
	_front = (_front + 1) % _capacity;
}

??隊(duì)列測試:

數(shù)據(jù)結(jié)構(gòu)上機(jī)實(shí)驗(yàn)——棧和隊(duì)列的實(shí)現(xiàn)、棧和隊(duì)列的應(yīng)用、進(jìn)制轉(zhuǎn)換、約瑟夫環(huán)問題,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c++,課程設(shè)計(jì)

????????????

4.利用棧實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換

??我們可以利用棧將一個十進(jìn)制數(shù)轉(zhuǎn)換為另一個進(jìn)制數(shù):

??函數(shù)首先聲明了兩個字符串變量s和table,以及兩個整型量m和n。table是一個包含16個字符的字符串,用于表示16進(jìn)制的數(shù)。

??然后函數(shù)要求用戶輸入要轉(zhuǎn)換的十進(jìn)制數(shù)m和目標(biāo)進(jìn)制數(shù)n。函數(shù)檢查如果輸入的數(shù)m為0,則直接輸出0,因?yàn)?在任何進(jìn)制下都等于0。

??接下來如果輸入的數(shù)m為負(fù)數(shù),則將其轉(zhuǎn)換為正數(shù),并標(biāo)記flag為true,表示這個數(shù)之前是負(fù)數(shù)。然后我們創(chuàng)建了一個名為st的堆,利用堆的性質(zhì),可以存儲轉(zhuǎn)換后的字符。在while循環(huán)中,函數(shù)將輸入的數(shù)m不斷模以目標(biāo)進(jìn)制數(shù)n,取出每次的余數(shù),將余數(shù)對應(yīng)的字符從table中取出,并壓入堆棧st中。 同時,更新輸入的數(shù)m為原來的數(shù)除以目標(biāo)進(jìn)制數(shù)。

??如果之前標(biāo)記過flag為true(即輸入的數(shù)是負(fù)數(shù)),則在堆棧中壓入一個’-'字符。最后,函數(shù)將堆棧中的所有字符取出并拼接到字符串s中,然后輸出這個字符串。這個字符串就是轉(zhuǎn)換后的數(shù)。

void Decimal_Conversion()
{
	string s, table = "0123456789ABCDEF";
	int m, n;
	cout << "請輸入:m為輸入的數(shù),n為轉(zhuǎn)換的進(jìn)制\n";
	cout << "m=";
	cin >> m;
	cout << "n=";
	cin >> n;
	bool flag = false;
	if (m == 0) cout << "0";

	//如果是負(fù)數(shù),則轉(zhuǎn)成正數(shù),并標(biāo)記一下
	if (m < 0)
	{
		m = 0 - m;
		flag = true;
	}

	Stack<char> st;

	//按進(jìn)制換算成對應(yīng)的字符添加到s
	while (m)
	{
		st.Push(table[m % n]);
		m /= n;
	}
	if (flag)
	{
		st.Push('-');
	}

	while (!st.Empty())
	{
		s += st.Top();
		st.Pop();
	}
	cout << s << endl;
}

??測試:
??
10轉(zhuǎn)化為2進(jìn)制:1010

數(shù)據(jù)結(jié)構(gòu)上機(jī)實(shí)驗(yàn)——棧和隊(duì)列的實(shí)現(xiàn)、棧和隊(duì)列的應(yīng)用、進(jìn)制轉(zhuǎn)換、約瑟夫環(huán)問題,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c++,課程設(shè)計(jì)??
150轉(zhuǎn)化為8進(jìn)制:226

數(shù)據(jù)結(jié)構(gòu)上機(jī)實(shí)驗(yàn)——棧和隊(duì)列的實(shí)現(xiàn)、棧和隊(duì)列的應(yīng)用、進(jìn)制轉(zhuǎn)換、約瑟夫環(huán)問題,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c++,課程設(shè)計(jì)
??
100001轉(zhuǎn)化為16進(jìn)制:186A1

數(shù)據(jù)結(jié)構(gòu)上機(jī)實(shí)驗(yàn)——棧和隊(duì)列的實(shí)現(xiàn)、棧和隊(duì)列的應(yīng)用、進(jìn)制轉(zhuǎn)換、約瑟夫環(huán)問題,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c++,課程設(shè)計(jì)
數(shù)據(jù)結(jié)構(gòu)上機(jī)實(shí)驗(yàn)——棧和隊(duì)列的實(shí)現(xiàn)、棧和隊(duì)列的應(yīng)用、進(jìn)制轉(zhuǎn)換、約瑟夫環(huán)問題,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c++,課程設(shè)計(jì)
????????????

5.利用隊(duì)列解決約瑟夫環(huán)問題

??我們可以利用隊(duì)列解決約瑟夫環(huán)問題。約瑟夫環(huán):描述了一組共m個人圍成一圈,從第n個人開始報(bào)數(shù),報(bào)到m的人出列,然后從下一個人重新開始報(bào)數(shù),直到所有的人都出列的問題。

??首先,函數(shù)向用戶提示輸入約瑟夫環(huán)的兩個人數(shù)m和n。然后,使用隊(duì)列que來模擬人們圍成的圓圈。初始時,將1到m的人依次入隊(duì)。使用一個計(jì)數(shù)器count,從1開始計(jì)數(shù),每次循環(huán)都會增加1,直到達(dá)到目標(biāo)n。

??如果計(jì)數(shù)器count小于目標(biāo)n,表示當(dāng)前人不需要出列,將隊(duì)頭元素取出(即這個人),從隊(duì)列中刪除(模擬這個人跳過),然后將這個元素重新插入隊(duì)尾(這個人回到圓圈的尾部)。 然后,計(jì)數(shù)器count加1,為下一次循環(huán)做準(zhǔn)備。

??如果計(jì)數(shù)器count等于目標(biāo)n,表示當(dāng)前人需要出列,將隊(duì)頭元素取出并打?。ㄟ@個人是出列的人),然后從隊(duì)列中刪除這個元素(模擬這個人完全出列),然后將計(jì)數(shù)器count重置為1,繼續(xù)下一輪循環(huán)。

??當(dāng)隊(duì)列為空時,說明所有的人已經(jīng)出列,退出循環(huán)。

void Joseph_Exchange()
{
	cout << "約瑟夫環(huán)問題:請輸入一共有m人,第n人出局:\n";
	int m, n;
	cout << "m=";
	cin >> m;
	cout << "n="; 
	cin >> n;

	//填入隊(duì)列中
	Queue<int> que;
	for (int i = 1; i <= m; i++)
	{
		que.Push(i);
	}

	//從第n開始計(jì)數(shù)
	for (int i = 1; i <= n; i++)
	{
		QElemType tmp = que.Head();
		que.Pop();
		que.Push(tmp);
	}

	//計(jì)數(shù)器,計(jì)到目標(biāo)就輸入
	int count = 1;
	while (!que.Empty())
	{
		if (count < n)
		{
			QElemType tmp = que.Head();
			que.Pop();
			que.Push(tmp);
			count++;
		}
		else if (count == n)
		{
			cout << que.Head() << " ";
			que.Pop();
			count = 1;
		}
	}
}

??測試:

數(shù)據(jù)結(jié)構(gòu)上機(jī)實(shí)驗(yàn)——棧和隊(duì)列的實(shí)現(xiàn)、棧和隊(duì)列的應(yīng)用、進(jìn)制轉(zhuǎn)換、約瑟夫環(huán)問題,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c++,課程設(shè)計(jì)
????????????

6.全部源碼

Stack.h

#pragma once

#define SElemType int
#define InitStackSize 100

template<class T>
class Stack
{
public:
	//構(gòu)造函數(shù)
	Stack()
	{
		_base = _top = new SElemType[InitStackSize];
		_size = InitStackSize;
	}

	//析構(gòu)函數(shù)
	~Stack()
	{
		delete[] _base;
		_top = _base = nullptr;
		_size = 0;
	}

	//入棧
	void Push(const SElemType& val)
	{
		//棧滿,擴(kuò)容
		if (_top - _base == _size)
		{
			//轉(zhuǎn)移棧中的元素
			SElemType* newbase = new SElemType[_size * 2];
			for (int i = 0; i < _size; i++)
			{
				newbase[i] = _base[i];
			}

			//刪除原來?xiàng)V性?/span>
			delete[] _base;
			_base = newbase;
			_top = newbase + _size;
			_size *= 2;
		}

		//入棧操作
		*_top = val;
		_top++;
		_size++;
	}

	//出棧
	void Pop(SElemType& e)
	{
		if (_size == 0)
		{
			cout << "該棧為空,無法刪除\n";
			return;
		}

		//出棧操作
		e = *_top;
		_top--;
		_size--;
	}

	//重載出棧
	void Pop()
	{
		if (_size == 0)
		{
			cout << "該棧為空,無法刪除\n";
			return;
		}

		//出棧操作
		_top--;
	}

	//輸出棧頂元素
	SElemType Top()
	{
		if (_base == _top)
		{
			cout << "棧空,沒有元素\n";
			return -1;
		}

		return *(_top - 1);
	}

	//判斷棧空
	bool Empty()
	{
		if (_base == _top)
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	//打印棧中的元素
	void Print()
	{
		SElemType* cur = _base;
		if (_base == _top)
		{
			cout << "該棧為空\n";
			return;
		}
		else
		{
			cout << "該棧中的元素為:";
			while (cur != _top)
			{
				cout << *cur << " ";
				cur++;
			}
			cout << endl;
		}
	}

private:
	SElemType* _base, * _top;
	int _size;
};

????????????

Queue.h

#pragma once

#define QueueSize 100
#define QElemType int

template<class T>
class Queue
{
public:
	//構(gòu)造函數(shù)
	Queue()
	{
		_base = new QElemType[QueueSize];
		_front = _rear = 0;
		_capacity = QueueSize;
	}

	//析構(gòu)函數(shù)
	~Queue()
	{
		delete[] _base;
		_base = nullptr;
		_front = _rear = 0;
		_capacity = 0;
	}

	//入隊(duì)操作
	void Push(const QElemType& val)
	{
		//判斷隊(duì)列是否已滿
		if (_front == (_rear + 1) % _capacity)
		{
			QElemType* newqueue = new QElemType[_capacity * 2];
			for (int i = _front; i < _rear; i++)
			{
				newqueue[i] = _base[i];
			}

			//刪除原來隊(duì)列中元素
			delete[] _base;
			_base = newqueue;
			_capacity *= 2;
		}

		_base[_rear] = val;
		//如果想讓隊(duì)列超過QueueSize的長度,一定要%_capacity;
		_rear = (_rear + 1) % _capacity;
	}

	//出隊(duì)操作
	void Pop(QElemType& e)
	{
		if (_front == _rear)
		{
			cout << "隊(duì)列為空,無法刪除\n";
			return;
		}

		e = _base[_front];
		_front = (_front + 1) % _capacity;
	}

	//重載出隊(duì)操作
	void Pop()
	{
		if (_front == _rear)
		{
			cout << "隊(duì)列為空,無法刪除\n";
			return;
		}

		_front = (_front + 1) % _capacity;
	}

	//輸出隊(duì)頭元素
	QElemType Head()
	{
		if (_front == _rear)
		{
			cout << "隊(duì)列為空,無隊(duì)頭元素\n";
			return -1;
		}
		
		return _base[_front];
	}

	//判斷是否為空隊(duì)列
	bool Empty()
	{
		if (_front == _rear)
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	//打印隊(duì)列中的元素
	void Print()
	{
		if (_front == _rear)
		{
			cout << "該隊(duì)列為空\n";
			return;
		}
		else
		{
			cout << "該隊(duì)列中的元素為:";
			for (int i = _front; i < _rear; i++) 
			{
				std::cout << _base[i] << " ";
			}
			cout << endl;
		}
	}

private:
	QElemType* _base;
	int _front, _rear;
	int _capacity;
};

????????????文章來源地址http://www.zghlxwxcb.cn/news/detail-718714.html

test.cpp

#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
using namespace std;

#include"Stack.h"
#include"Queue.h"

void stack_test()
{
	Stack<int> st;
	st.Print();
	cout << "該棧是否為空:" << st.Empty() << endl;
	st.Push(1);
	st.Push(2);
	st.Push(3); 
	st.Push(4);
	st.Print();
	cout << "棧頂元素為:" << st.Top() << endl;
	st.Pop();
	st.Pop();
	st.Print();
	cout << "該棧是否為空:" << st.Empty() << endl;
	st.Push(5);
	st.Push(6);
	st.Push(7);
	st.Push(8);
	st.Print();
	cout << "棧頂元素為:" << st.Top() << endl;
	st.Pop();
	st.Pop();
	st.Print();
}

void queue_test()
{
	Queue<int> que;
	que.Print();
	cout << "該隊(duì)列是否為空:" << que.Empty() << endl;
	que.Push(1);
	que.Push(2);
	que.Push(3);
	que.Push(4);
	que.Print();
	cout << "隊(duì)頭元素為:" << que.Head() << endl;
	que.Pop();
	que.Pop();
	que.Print();
	cout << "該隊(duì)列是否為空:" << que.Empty() << endl;
	que.Push(5);
	que.Push(6);
	que.Push(7);
	que.Push(8);
	que.Print();
	cout << "隊(duì)頭元素為:" << que.Head() << endl;
	que.Pop();
	que.Pop();
	que.Print();
}

void Decimal_Conversion()
{
	string s, table = "0123456789ABCDEF";
	int m, n;
	cout << "請輸入:m為輸入的數(shù),n為轉(zhuǎn)換的進(jìn)制\n";
	cout << "m=";
	cin >> m;
	cout << "n=";
	cin >> n;
	bool flag = false;
	if (m == 0) cout << "0";

	//如果是負(fù)數(shù),則轉(zhuǎn)成正數(shù),并標(biāo)記一下
	if (m < 0)
	{
		m = 0 - m;
		flag = true;
	}

	Stack<char> st;

	//按進(jìn)制換算成對應(yīng)的字符添加到s
	while (m)
	{
		st.Push(table[m % n]);
		m /= n;
	}
	if (flag)
	{
		st.Push('-');
	}

	while (!st.Empty())
	{
		s += st.Top();
		st.Pop();
	}
	cout << s << endl;
}

void Joseph_Exchange()
{
	cout << "約瑟夫環(huán)問題:請輸入一共有m人,第n人出局:\n";
	int m, n;
	cout << "m=";
	cin >> m;
	cout << "n="; 
	cin >> n;

	//填入隊(duì)列中
	Queue<int> que;
	for (int i = 1; i <= m; i++)
	{
		que.Push(i);
	}
	
	//從第n開始計(jì)數(shù)
	for (int i = 1; i <= n; i++)
	{
		QElemType tmp = que.Head();
		que.Pop();
		que.Push(tmp);
	}

	//計(jì)數(shù)器,計(jì)到目標(biāo)就輸入
	int count = 1;
	while (!que.Empty())
	{
		if (count < n)
		{
			QElemType tmp = que.Head();
			que.Pop();
			que.Push(tmp);
			count++;
		}
		else if (count == n)
		{
			cout << que.Head() << " ";
			que.Pop();
			count = 1;
		}
	}
}

int main()
{
	//stack_test();
	//queue_test();
	//Decimal_Conversion();
	Joseph_Exchange();
	return 0;
}

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)上機(jī)實(shí)驗(yàn)——棧和隊(duì)列的實(shí)現(xiàn)、棧和隊(duì)列的應(yīng)用、進(jìn)制轉(zhuǎn)換、約瑟夫環(huán)問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包