1. 程式人生 > >用迴圈連結串列實現佇列

用迴圈連結串列實現佇列

佇列記住的是back的地址

構造時back指向back,表示空佇列;

#include<iostream>
#include<ctime>//...
#include<stdlib.h>//隨機數要的


using namespace std;

template<typename T>
class listNode//只是一個節點
{
public:
	T NodeData;
	listNode *next;
	listNode(T data, listNode * ne){ NodeData = data; next = ne; }
	listNode(){ NodeData = NULL; next = NULL; }
};




template<typename T>
class Queue
{
public:
	Queue();
	Queue(const  Queue<T> & or);
	void enqueue(const T & item);//
	void dequeue();//
	const T & front() const;
	bool empty() const;//
	void display() const;
	Queue & operator =(const Queue<T> &or);
	~Queue();
private:
	listNode<T>* myBack;
};

template<typename T>
Queue<T>::Queue(){ myBack = new listNode<T>(); myBack->next = myBack; }//這個myback已經成了最簡單的迴圈列表,指向它自己,這個myback都是留著不放東西的,也將是是否為空的判斷依據!


template<typename T>
Queue<T>::Queue(const  Queue<T>& or)
{ 
	myBack = new listNode<T>();
	myBack->next = myBack;
	listNode<T> *pr = or.myBack->next,*pt=myBack->next;
	myBack->NodeData = or.myBack->NodeData;
	myBack->next = myBack;

	while (pr !=or.myBack)
	{
		pt = new listNode<T>(NULL, myBack->next);
		myBack->NodeData = pr->NodeData;
		myBack->next = pt;
		myBack = pt;
		pr = pr->next;
	}


}


template<typename T>
Queue<T>::~Queue()
{ 
	listNode<T> *pr=myBack->next,*pt; 
	while (pr != myBack)
	{
		pt = pr->next;
		delete pr;
		pr = pt;
	}
}

template<typename T>
void Queue<T>::enqueue(const T & item)//新增咯,感覺是除了構造最重要的函式
{ //這裡是這樣的:先新建一個節點記住myback的next,這樣才能保證是個迴圈的圈~(因為最後這個節點會變成myback);
	listNode<T> *pr;
	pr = new listNode<T>(NULL, myBack->next);//記住myback的下一個就是第一個的地址;
	myBack->NodeData = item;//把要新增的節點的值賦給當前的最後一個;
	myBack->next = pr;//指向新節點,將是新的myback;
	myBack = pr;//這樣myback就後移了
}//其實就是將新節點插在myback前面,而且沒有遍歷連結串列。


template<typename T>
bool Queue<T>::empty() const  { return myBack == myBack->next; }//就和剛構造的時候一樣,當就剩下一個myback的時候哦就是空了;


template<typename T>
void Queue<T>::dequeue()//刪除第一個節點。也就是myback間隔跳了一個,然後哦把跳過的那一個的空間給還了;
{
	listNode<T> *pr;
	try
	{
		if (empty())//先判斷是不是空的,空的不能刪,給它報錯
			throw out_of_range("Queue<>::dequeue() :empty queue");
		else
		{
			pr = myBack->next;//pr記住myback的next(其實就是第一個了),為了跳過第一個有了第二句。。
			myBack->next = pr->next;//跳過了
			delete pr;//還空間
		}
		
	}
	catch (exception const& ex)//抓異常的
	{
		cerr << "Exception: " << ex.what() << endl;
	}

}


template<typename T>
const T & Queue<T>::front() const
{
	listNode<T> *pr;
	pr = myBack->next;
	
	try
	{
		if (empty())
			throw out_of_range("Queue<>::dequeue() :empty queue");
		else
			return pr->NodeData;

	}
	catch (exception const& ex)
	{
		cerr << "Exception: " << ex.what() << endl;
	}

}


template<typename T>
void Queue<T>::display() const
{
	listNode<T> *pr=myBack->next;
	if (empty())
	{
		cout << "Queue<>::dequeue() :empty queue\n";
		return;
	}
	while (pr!=myBack)
	{
		cout << pr->NodeData<<" ";
		pr = pr->next;
	}
	cout << endl;
}

template<typename T>
Queue<T> & Queue<T>::operator =(const Queue<T> &or)
{
	Queue<T>::~Queue();
	myBack = new listNode<T>();
	myBack->next = myBack;
	listNode<T> *pr = or.myBack->next, *pt = myBack->next;
	myBack->NodeData = or.myBack->NodeData;
	myBack->next = myBack;

	while (pr != or.myBack)
	{
		pt = new listNode<T>(NULL, myBack->next);
		myBack->NodeData = pr->NodeData;
		myBack->next = pt;
		myBack = pt;
		pr = pr->next;
	}
	return *this;
}
//測試檔案
#include"Queue.h"

using namespace std;

int main()
{
	Queue<int> que;
	int i = 1;
	int num;
	srand(unsigned int(time(0)));
	cout << "隨機產生的從0~99的數字20個:" << endl;
	for (; i <= 20; i++)
	{
		num = rand() % 100;
		cout << num << " ";
		que.enqueue(num);
	}
	cout << endl<<endl<<endl;
	system("pause");
	que.display();
	system("pause");

	Queue<int> que2(que), que3 = que;
	//que2.display();
	//que3.display();
	//system("pause");
	cout << "開始刪除\n";
	while (!que.empty())
	{
		cout << que.front() <<endl;
		que.dequeue();
	}
	cout << endl;
	system("pause");
	que.dequeue();
	system("pause");
	que.display();
	system("pause");
	cout<<que.front();
	system("pause");

	cout << "que2 以及que3 未被刪\n";
	que2.display();
	que3.display();
	system("pause");


	return 0;
}



相關推薦

迴圈連結串列實現佇列

佇列記住的是back的地址 構造時back指向back,表示空佇列; #include<iostream> #include<ctime>//... #include<stdlib.h>//隨機數要的 using namespac

Java連結串列實現佇列

佇列--先入先出 棧---後入先出 連結串列實現佇列和棧。首先我們需要構建一個連結串列。連結串列有哪幾要素?   1、連結串列本身的value 2、連結串列的next指標,next指標指的還是同樣型別的值。 下邊看程式碼 public class Element&l

佇列C++ | 連結串列實現佇列_2

 用連結串列實現佇列 /*Queue - Linked List implementation*/ #include<stdio.h> #include<stdlib.h> struct Node { int data; struct Node* next;

連結串列實現佇列

    所有的資料結構都可以大致分為兩類,由連續單位構成或者由離散單位構成,具體到實體也就是陣列實現或者連結串列實現。陣列實現的資料結構方便查詢和修改但不方便增刪,連結串列實現的資料結構則剛好相反,適於增刪卻不便於查詢。      今天我們用連結串列來實現佇列。      我

連結串列實現佇列--鏈式佇列

/* 一、關於鏈式佇列的約定(目的是在C語言中描述方便) 1.定義: (1)佇列是一種先進先出的線性表; (2)它只允許在表的一端進行入隊,在另一端進行出隊操作。在佇列中,允許插入的一端 叫隊尾,允許刪除的一端較隊頭,即入隊只能從隊尾入,出隊只

迴圈連結串列解決約瑟夫環的問題

約瑟夫環問題簡介  約瑟夫環問題的原來描述為,設有編號為1,2,……,n的n(n>0)個人圍成一個圈,從第1個人開始報數,報到m時停止報數,報m的人出圈,再從他的下一個人起重新報數,報到m時停止報數,報m的出圈,……,如此下去,直到所有人全部出圈為止。當任意給定n和m後,設計演算法求n個人出

java版資料結構與演算法—連結串列實現佇列

package com.zoujc.QueueLink; /** * 連結串列實現佇列 */ class FirstLastList { private Link first; private Link last; public FirstLastList(){

實驗三 靜態連結串列實現學生成績管理系統

#include<iostream.h> #include<stdlib.h> typedef int ElemType; typedef int DataType; const int MaxSize=100; typedef struct { ElemType data

資料結構之連結串列實現佇列

#include<stdio.h>#include<malloc.h>#include<stdlib.h>#define OK 1#define ERROR 0typedef struct Node{ int data; struct Node *next;}Node,*L

連結串列實現佇列

這次寫的還算正規,稍微壓縮了一下程式碼,但是不影響閱讀 畫個圖幫助理解: F->0->0->0<-R 第一個0不存資料  #include<stdio.h> #include<malloc.h> #include&l

約瑟夫環問題(迴圈連結串列實現

約瑟夫環問題,n個人圍成一圈,報數到m的人出列,直至n個人全部出列,問出列人的順序 手寫迴圈連結串列模擬實現 #include<stdio.h> #include<stdlib.h> typedef struct SingleNode {

約瑟夫問題(陣列與迴圈連結串列實現)

約瑟夫問題 一個旅行社要從n名旅客中選出一名幸運旅客,為他提供免費環球旅行服務。方法是,大家站成圈,然後選定一個m,從第1個人開始報數,報到m時,這個人OUT,然後從下一個人開始重新從1報數,重複這個過程,直到最後剩下一個人就是幸運之星。問題就是誰是幸運者呢?

【資料結構】帶有尾指標的連結串列連結串列實現佇列

前面寫了用動態陣列實現佇列,現在我將用帶有尾指標的連結串列實現佇列。 我們知道佇列需要在兩端進行操作,如果是以普通連結串列進行底層實現的佇列,在入隊時需要找到最後一個節點才能進行新增元素,這樣相當於遍歷一遍連結串列,從而造成巨大的時間浪費。 為了解決這個問題,我們引入了尾

帶頭結點的迴圈連結串列表示佇列, 並且只設一個指標指向隊尾元素結點, 試編寫相應的佇列初始化,入佇列和出佇列的演算法

資料結構演算法題(假設以帶頭結點的迴圈連結串列表示佇列, 並且只設一個指標指向隊尾元素結點(注意不設頭指標) 試編寫相應的佇列初始化,入佇列和出佇列的演算法!) /* 資料結構演算法題

資料結構——連結串列實現佇列(泛型)

package Test; public class LinkedListQueue { public static void main(String[] args) { // TODO Auto-generated method stub Queue <Integer>

淺談雙向連結串列的逆轉以及雙向連結串列實現malloc/free/realloc

  雙向連結串列因為在Linux核心廣泛使用,且能較好地考察對指標的理解,所以它的增刪、逆轉,以及如何用它來實現malloc/free/realloc等問題就成了技術型公司的偏好。   本篇第一部分談雙向連結串列的建立、增、刪,不想閱讀的讀者可以直接跳過,第二部分談如何實現

C++控制檯迴圈連結串列實現貪吃蛇

-stdafx.h 為了簡化程式定義一些巨集和全域性變數 #ifndef __STDAFX_H__ #define __STDAFX_H__ // ============上下左右=========

稀疏矩陣的加法(十字連結串列實現A=A+B)

描述: 輸入兩個稀疏矩陣A和B,用十字連結串列實現A=A+B,輸出它們相加的結果。 輸入: 第一行輸入四個正整數,分別是兩個矩陣的行m、列n、第一個矩陣的非零元素的個數t1和第二個矩陣的非零元素的個數t2,接下來的t1+t2行是三元組,分別是第一個矩陣的資料和第二個矩

C語言連結串列實現佇列操作

還是操作佇列,但是這次換成連結串列,但是要注意出隊的操作。 一般的思維是在出隊的時候,刪除頭結點的下一個節點,這樣的話確實可以將佇列中的節點全部刪除,但是如果我們將最後一個節點刪除的時候,我們的演算法就將tail指標賦值為NULL,這時如果再進行入隊操作的時候,就會發生段錯

利用雙向迴圈連結串列實現任意長的整數進行加法運算

【問題描述】 設計一個實現任意長的整數進行加法運算的演示程式 。 【基本要求】 利用雙向迴圈連結串列實現長整數的儲存,每個結點含一個整形變數。輸入和輸出形式:按中國對於長整數的表示習慣,每四位一組,組間用逗號隔開。 【測試資料】 (1)0;0;應輸出“0”