`

【数据结构】链式队列 Linked_queue

 
阅读更多

08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活。此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/details/7747205


链式队列各种基本运算算法的实现


队列是一种先进先出的线性表。就如同现实中的排队,先来的先服务。通过基本的append()将元素加入队列,serve()将元素移出队列。
链式队列是不同于循环数组的另一种队列的实现形式。队列中的元素以Node形式存储。节点Node中存有此节点存于队列中的元素以及指向下一个元素的指针。链式队列的需要保存指向队头和队尾的指针的数据成员。同链式栈的实现一样,链式队列的实现尤其重点和难点的部分是编写自己的析构函数,拷贝构造函数和重载赋值运算符。


【实验说明】

我选择的题目是书中应用程序多项式的编写。
1.链式队列中的元素以节点的形式存储,首先编写结构Node的定义和实现。
2.编写链式队列的定义和实现。队列中的数据成员是指向队头的指针*font以及指向队尾的指针*rear。成员函数有最基本的操作appent(),serve(),retireve()分别用以相队列中填入、移出元素以及得到队头的元素。empty()用以判断队列是否为空。更重要的是编写队列自己的析构函数~Queue(),拷贝构造函数Queue(const Queue &original);以及重载赋值运算符void operator=(const Queue &original);
3.从队列中继承一个新的类Extended_queue,添加一些新的功能——size()得到队列大小,clear()清空队列,serve_and_retrieve()得到并移出队头的元素。
4.分析多项式中每一项既有系数又有指数。定义并实现一个新的结构Term用以表示多项式中的一项。Term中含有公有数据成员degree和coefficient。
5.因为多项式的特点,所以定义多项式类Polynomial为从类Extended_queue中派生出来的类。
并添加他自己的一些成员函数。print()打印多项式;equals_sum()求两个多项式的和,equals_difference()求两个多项式的差;degree()得到多项式最高项的系数。
6.实现多项式类。
7.编写主函数简单实现并测试多项式的运算。


【相关代码】

linked_queue.h
typedef Term Queue_entry;

class Queue
{
public:
	Queue();
	bool empty()const;
	Error_code append(const Queue_entry &item);
	Error_code serve();
	Error_code retireve(Queue_entry &item)const;
	~Queue();
	Queue(const Queue &original);
	void operator=(const Queue &original);
protected:
	Node *front, *rear;
};

class Extended_queue: public Queue
{
public:
	//bool full()const;
	int size()const;
	void clear();
	Error_code serve_and_retrieve(Queue_entry &item);
};
linked_queue.cpp
Queue::Queue()
{
	front=rear=NULL;
}

bool Queue::empty()const{
	if(front==NULL)
		return true;
	else
		return false;
}
Error_code Queue::append(const Queue_entry &item)
{
	Node *new_rear = new Node(item);
	if(new_rear==NULL)return overflow;
	if(rear==NULL)front=rear=new_rear;
	else{
		rear->next=new_rear;
		rear=new_rear;
	}
	return success;
}

Error_code Queue::serve()
{
	if(front==NULL)
		return underflow;
	Node *old_front=front;
	front=old_front->next;
	if(front==NULL)
		rear=NULL;
	delete old_front;
	return success;
}

Error_code Queue::retireve(Queue_entry &item)const{
	if(empty())
		return underflow;
	else{
		item=front->entry;
		return success;
	}
}


Queue:: ~Queue()
{
	while(!empty())
		serve();
}

void Queue::operator =(const Queue &original)
{
	Node *new_rear,*new_front,*new_copy,*original_node=original.front;
	if(original_node==NULL){
		new_front=new_rear=NULL;
	}
	else{
		new_copy=new_front=new Node(original_node->entry);
		while(original_node->next!=NULL){
			original_node=original_node->next;
			new_copy->next=new Node(original_node->entry);
			new_copy=new_copy->next;
		}
		original_node=original.rear;
		new_rear=new Node(original_node->entry);
		new_rear->next=NULL;
	}
	while(!empty())
		serve();
	front=new_front;
	rear=new_rear;
}

Queue::Queue(const Queue &original)
{
	Node *new_copy,*original_node=original.front;
	if(original_node==NULL)                              
		front=rear=NULL;
	else{
		front=new_copy=new Node(original_node->entry);
		while(original_node->next!=NULL){
			original_node=original_node->next;
			new_copy->next=new Node(original_node->entry);
			new_copy=new_copy->next;
		}
		original_node=original.rear;
		rear=new_copy=new Node(original_node->entry);
	}
}


int Extended_queue::size()const
{
	Node *window=front;
	int count=0;
	while(window != NULL){
		window=window->next;
		count++;
	}
	
	return count;
}

void Extended_queue::clear()
{
	while(!empty())
		serve();
}
Error_code Extended_queue::serve_and_retrieve(Queue_entry &item)
{
	if(front==NULL)
		return underflow;
	Node *old_front=front;
	front=old_front->next;
	item=old_front->entry;
	if(front==NULL)rear=NULL;
	delete old_front;
	return success;
}
Polynomial.h
class Polynomial: private Extended_queue
{
public:
	void read();
	void print()const;
	void equals_sum(Polynomial p,Polynomial q);
	void equals_difference(Polynomial p,Polynomial q);
	//void equals_product(Polynomial p,Polynomial q);
	//Error_code equals_quotient(Polynomial p,Polynomial q);
	int degree()const;
private:
	//void mult_term(Polynomial p,Term t);
};
Polynomial.cpp
void Polynomial::print() const
{
	Node *print_node=front;
	bool first_term=true;
	while(print_node != NULL){
		Term &print_term=print_node->entry;
		if(first_term){
			first_term=false;
			if(print_term.coefficient<0)
				cout<<" - ";
		}
		else if(print_term.coefficient<0)
			cout<<" - ";
		else
			cout<<" + ";
		double r=(print_term.coefficient>=0)
			?print_term.coefficient:-(print_term.coefficient);
		if(r!=1)
			cout<<r;
		if(print_term.degree>1)
			cout<<"X^"<<print_term.degree;
		if(print_term.degree==1)
			cout<<"X";
		if(r==1 && print_term.degree==0)
			cout<<"1";
		print_node=print_node->next;
	}
	if(first_term)
		cout<<"0";
	cout<<endl;
}

void Polynomial::read()
{
	clear();
	double coefficient;
	int last_exponent,exponent;
	bool first_term=true;
	cout<<"Enter the coffiecients and exponents for the polynomial,"
		<<"one pair per line. Exponents must be in descending order."<<endl
		<<"Enter a coefficient of 0 or exponent of 0 to termnimante."<<endl;
	do{
		cout<<"coefficient?"<<flush;
		cin>>coefficient;
		if(coefficient!=0.0){
			cout<<"exponent?"<<flush;
			cin>>exponent;
			if((!first_term&&exponent>=last_exponent)||exponent<0){
				exponent=0;
				cout<<"Bad exponent: Polynomial terminates without its last term."
					<<endl;
			}
			else{
				Term new_term(exponent,coefficient);
				append(new_term);
				first_term=false;
			}
			last_exponent=exponent;
		}
	}while(coefficient!=0.0&&exponent!=0);
}

void Polynomial::equals_sum(Polynomial p, Polynomial q)
{
	clear();
	while(!p.empty()||!q.empty()){
		Term p_term,q_term;
		if(p.degree()>q.degree()){
			p.serve_and_retrieve(p_term);
			append(p_term);
		}
		else if(q.degree()>p.degree()){
			q.serve_and_retrieve(q_term);
			append(q_term);
		}
		else{
			p.serve_and_retrieve(p_term);
			q.serve_and_retrieve(q_term);
			if(p_term.coefficient+q_term.coefficient!=0){
				Term answer_term(p_term.degree,
					p_term.coefficient+q_term.coefficient);
				append(answer_term);
			}
		}
	}
}
void Polynomial::equals_difference(Polynomial p,Polynomial q)
{
	Polynomial neg_q;
	while(!q.empty()){
		Term temp;
		q.serve_and_retrieve(temp);
		temp.coefficient=-1*temp.coefficient;
		neg_q.append(temp);
	}
	equals_sum(p,neg_q);
}

int Polynomial::degree()const
{
	if(empty())
		return -1;
	Term lead;
	retireve(lead);
	return lead.degree;
}



【过程记录】

实验截图:


【结果分析】

1.同链式栈一样,链式队列中以节点的形式存储队列中的元素,所以他的实现与栈有很多相似之处。所不同的是队列中元素操作原则是“先进先出”,不同于栈的“后进先出”,所以类Queue中需要分别保存指向队列首元素和尾元素地址的指针。
2.同样,链式队列要注意编写自己的析构函数,拷贝构造函数和重载赋值运算符。
3.通过对多项式特点的分析,我们从拓展队列Extended_queue中派生出类Polynomial,继承是c++中非常重要的性质,可以简化我们很多程序的编写。
4.多项式中每一项的元素包括系数和指数两部分,所以我们编写了结构Term用以表示多项式中的每一项,此时类增多,要时刻保持清醒的头脑了解他们的关系,Term是存储于节点中的entry部分,不同类的存储我们没有用类模板,而是使用typedef,这就要很仔细的定义他们的类型,不然很容易出现函数调用中类型不能转换的错误。


实验代码下载:http://download.csdn.net/detail/xiaowei_cqu/4434472

(转载请注明作者和出处:http://blog.csdn.net/xiaowei_cqu未经允许请勿用于商业用途)





分享到:
评论

相关推荐

    数据结构栈、链式队列、树的实现

    **链式队列**(Linked Queue)是另一种线性数据结构,但与栈不同,它遵循“先进先出”(First In, First Out,简称FIFO)原则。队列的主要操作包括入队(Enqueue)新元素到队尾和出队(Dequeue)队首元素。链式队列...

    栈与队列头文件

    链式队列(Linked Queue)则是使用链表作为底层数据结构的队列,相比于数组实现,链式队列在插入和删除元素时更灵活,不需要考虑数组的容量问题。链表节点包含数据和指向下一个节点的指针,因此在队列的尾部添加元素...

    queue_shujujiegou_

    在这个场景中,我们有两个JavaScript文件——`circular-queue-on-linked-list.js`和`queue-on-linked-list.js`,它们分别可能涉及环形队列和普通链式队列的实现。 1. 链表基础:链表是一种非连续存储的数据结构,由...

    图形变换(数据结构课程设计)

    代码片段中展示了链式队列的具体实现,其中`Linked_Queue`类模板是基于链表实现的队列。具体实现包括: - **构造函数与析构函数**:负责初始化和清理队列资源。 - **成员函数**:如`Is_Empty`检查队列是否为空,`Is_...

    数据结构(Java语言描述) 单元设计_单元3 栈和队列.doc

    链式队列(Linked Queue)** 链式队列使用链表结构,队头和队尾分别由头节点和尾节点标识,添加和删除操作只需修改对应的节点指针,无需进行元素移位,因此在处理队列操作时效率较高。 **7. 递归(Recursion)** ...

    数据结构英文课件:Chap3 Stack and Queue.ppt

    队列的实现通常有两种形式:顺序队列(Array-based Queue)和链式队列(Linked List-based Queue)。 **顺序队列**: - 使用数组实现,与栈类似,但在两端操作。入队(Enqueue)发生在队尾,出队(Dequeue)发生在...

    24wd数据结构栈部分缺失的视频

    接下来,我们来看看队列(Queue),它是另一种基础数据结构,遵循“先进先出”(First In First Out,简称FIFO)原则。队列的主要操作包括入队(Enqueue)和出队(Dequeue)。队列在多任务处理、打印队列、缓冲区...

    数据结构源码JS实现.zip

    3. **单项列表**(Singly Linked List):是最基本的链式数据结构,每个节点包含数据和指向下一个节点的引用。"单项列表.html"将展示如何实现基本的添加、删除和遍历操作。 4. **哈希表**(Hash Table):通过散列...

    数据结构答案——最新李云清2009版!

    数据结构答案——最新李云清2009版! 该资源提供了数据结构的答案,涵盖...该资源提供了数据结构的详细答案,涵盖了顺序表、链式存储、循环队列、排序等多个方面的知识点,为学习数据结构的学生提供了很好的参考资料。

    作业 第三章 栈和队列 顺序存储结构和链式存储结构

    本章主要探讨的是两种常用且基础的数据结构——栈(Stack)和队列(Queue),以及它们的两种基本存储方式:顺序存储结构(Sequential Storage Structure)和链式存储结构(Linked Storage Structure)。我们将深入...

    数据结构模板

    - `Queue_array`: 存储队列元素的数组。 - `front`: 队头指针。 - `rear`: 队尾指针。 #### 八、链队 (Linked Queue) 链队是利用链式存储结构实现的队列。 **定义:** ```c typedef struct Qnode { ElemType data...

    数据结构数据结构数据结构数据结构数据结构

    3. **链表(Linked List)**:链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。 - 单链表:每个节点只有一个指向下一个节点的指针。 - 双向链表:每个节点有两个指针,一个...

    数据结构:第3章 限定性线性表—栈和队列.ppt

    数据结构是计算机科学中至关重要的基础概念,它研究如何有效地组织和管理数据,以提高算法的效率和系统性能。在本章中,我们将专注于两种特殊类型的线性数据结构——栈和队列,它们在逻辑上属于线性表,但在操作上...

    广东工业大学《数据结构》复习题(含答案).pdf

    根据提供的信息来看,这份文档似乎并未包含实际的“广东工业大学《数据结构》复习题(含答案)”的具体内容,而是重复出现了一些不明的文字“创创大帝”。因此,基于现有信息,我们将围绕“数据结构”这一核心主题...

    数据结构考试复习资料非常好用

    链表是一种动态的数据结构,用于存储链式的元素。链表的优点是可以动态地插入、删除元素,而不需要像数组那样需要预分配空间。 3. 栈(Stack) 栈是一种后进先出的数据结构,用于模拟函数调用、表达式求值等场景。...

    数据结构与算法.docx

    ### 数据结构概述 数据结构是计算机科学中的一个重要概念,它主要关注如何在计算机中有效存储、组织和管理数据。良好的数据结构设计对于提高程序效率、简化编程任务至关重要。本章节将深入探讨数据结构的基本概念、...

    栈和队列PPT学习教案.pptx

    1. 链式队列(Linked Queue):利用链表实现,队头和队尾分别指向链表的开始和末尾。 2. 循环队列(Circular Queue):使用固定大小的数组,通过调整队头和队尾指针来模拟队列的入队和出队操作。 栈和队列的应用...

    数据结构课后题

    同时,书中还介绍了栈和队列的链式实现和数组实现,帮助学生理解数据结构的不同表示方式及其优缺点。 ### 4. 树(Tree) 树是一种非线性数据结构,它由一个根节点和若干子树构成,子树本身也是一个树。在耿国华版的...

    计算机软件基础:12第四章数据结构栈-队列.doc

    队列(Queue)则是一种先进先出(First In First Out, FIFO)的数据结构,类似于排队等待服务的人群。新加入的元素总是在队尾,而服务完成的元素则从队头移除。队列主要的操作包括入队(Enqueue)和出队(Dequeue)...

    专升本数据结构第三-四章+栈+队列.pdf

    队列(Queue)是另一种线性数据结构,遵循“先进先出”(FIFO,First In First Out)原则,元素的插入在队尾,删除在队头。队列在操作系统、任务调度、缓冲区管理等方面有重要应用。 学习栈和队列不仅是理解数据...

Global site tag (gtag.js) - Google Analytics