算法与数据结构基础6:C++队列的简单实现

队列也是基于队列,弄懂了队列,队列就很好懂了

// Queue.h

#include <cstdio>
#include <cassert>
#include <iostream>

using namespace std;

class Queue
{
public:
	// **************************************************************************
	// 类的四大函数:构造函数、拷贝构造函数、重载赋值运算符、析构函数
	// **************************************************************************
	Queue();
	Queue(const Queue &Queue);
	Queue& operator=(const Queue &Queue);
	~Queue();

	// **************************************************************************
	// 增删改查
	// **************************************************************************
	int Pop();
	void Push(const int& data);

	unsigned short Size();
	bool IsEmpty();
	void PrintQueue();

private:
	void Free();

private:
	typedef struct Node{
		Node(int d):data(d),next(NULL){}
		int data;
		struct Node* next;
	}Node;

	Node* m_head;
	Node* m_tail;/* 这个变量加得有点鸡肋,最初是想用来操作链表尾,发现只有插入的时候能用,删除的时候用不了,因为没有前指针 */
	unsigned short m_size;
};

// **************************************************************************
// 私有方法
// **************************************************************************
void Queue::Free()
{
	if(m_head){
		Node* tmp = NULL;
		while(m_head){
			tmp = m_head;
			m_head = m_head->next;
			delete tmp;
		}
	}
	m_head = NULL;
	m_tail = NULL;
	m_size = 0;
}

// **************************************************************************
// 类的四大函数:构造函数、拷贝构造函数、重载赋值运算符、析构函数
// **************************************************************************
Queue::Queue()
{
	m_head = NULL;
	m_tail = NULL;
	m_size = 0;
}

Queue::Queue(const Queue &Queue)
{
	m_head = NULL;
	m_tail = NULL;

	m_size = Queue.m_size;

	if(Queue.m_head){
		Node* tmp = Queue.m_head;
		Node* q = NULL;
		while(tmp){
			Node* node = new Node(tmp->data);
			if(!m_head){
				m_head = node;
				q = m_head;
			}
			else{
				q->next = node;
				q = node;
			}
			tmp = tmp->next;
		}
		m_tail = q;
	}
	else{
		m_head = NULL;
		m_tail = NULL;
	}
}

Queue& Queue::operator=(const Queue &Queue)
{
	Free();

	m_size = Queue.m_size;

	if(Queue.m_head){
		Node* tmp = Queue.m_head;
		Node* q = NULL;
		while(tmp){
			Node* node = new Node(tmp->data);
			if(!m_head){
				m_head = node;
				q = m_head;
			}
			else{
				q->next = node;
				q = node;
			}

			tmp = tmp->next;
		}
		m_tail = q;
	}
	else{
		m_head = NULL;
		m_tail = NULL;
	}

	return *this;
}

Queue::~Queue()
{
	if (m_head){
		Node* tmp = m_head;
		while (tmp){
			m_head = m_head->next;
			delete tmp;
			tmp = m_head;
		}
	}
	m_head = NULL;
	m_tail = NULL;
}

// **************************************************************************
// 增删改查
// **************************************************************************
void Queue::Push(const int& data)
{
	Node* tmp = new Node(data);
	if (!m_head) {
		m_head = tmp;
		m_tail = tmp;
	}
	else{
		tmp->next = m_head;
		m_head = tmp;
	}
	++m_size;
}

int Queue::Pop()
{
	assert(m_size > 0);

	int val = 0;
	Node *cur, *pri;
	if (!m_head->next){
		val = m_head->data;
		delete m_head;
		m_head = NULL;
		m_tail = NULL;
		m_size = 0;
	}
	else{
		cur = m_head;
		while (cur->next->next){
			cur = cur->next;
		}
		pri = cur;
		m_tail = cur;
		cur = cur->next;
		pri->next = NULL;
		val = cur->data;
		delete cur;
		cur = NULL;

		--m_size;
	}

	return val;
}

unsigned short Queue::Size()
{
	return m_size;
}

bool Queue::IsEmpty()
{
	return (m_size == 0);
}

void Queue::PrintQueue()
{
	cout << "size : " << m_size << " , content : ";
	if (m_head){
		Node* tmp = m_head;
		while (tmp){
			cout << tmp->data << " -> ";
			tmp = tmp->next;
		}
	}

	cout << "NULL" << endl;
}

// main.cpp

// test for Queue
#include "Queue.h"
#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
	Queue queue;
	for (int i = 1; i < 5; ++i){
		queue.Push(i);
	}
	queue.PrintQueue();

	Queue queueCopy(queue);
	queueCopy.PrintQueue();

	Queue queueAssig;
	queueAssig = queue;
	queueAssig.PrintQueue();

	int pop = queue.Pop();
	cout << "pop:" << pop << endl;
	queue.PrintQueue();

	system("pause");

	return 0;
}

// 输出截图

时间: 2024-10-14 15:04:38

算法与数据结构基础6:C++队列的简单实现的相关文章

算法与数据结构基础10:C++实现——拓扑排序

一 定义 拓扑排序是对有向无环图(Directed Acyclic Graph简称DAG)顶点的一种排序, 它使得如果存在一条从顶点A到顶点B的路径,那么在排序中B出现在A的后面. 二 先决条件 能够进行拓扑排序图有两个先决条件:有向.无环,即有向无环图. 三 偏序全序 连通图:任意两点之间都存在至少一条边 偏序:非连通图(有向无环图满足偏序关系) 全序:单连通图 四 结果唯一性 对于仅满足偏序关系的有向无环图中,因为有两个点之间的关系是不确定的,所以导致排序的结果是不唯一的. 满足全序关系的有

算法与数据结构基础 - 广度优先搜索(BFS)

BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数据结构基础 - 队列(Queue) 最直观的BFS应用是图和树的遍历,其中图常用邻接表或矩阵表示,例如 LeetCode题目 690. Employee Importance: // LeetCode 690. Employee Importance/* class Employee { publi

算法与数据结构基础11:C++实现——二拆搜索树节点删除

基于我的另一篇文章<算法与数据结构基础4:C++二叉树实现及遍历方法大全> ,二叉树的结构用的这篇文章里的. 二查找叉树的删除可以细分为三种情况: 1 被删除的是叶子节点,直接删除: 2 被删除只有一个子节点,指针下移: 3 有两个子节点,为了不破坏树的结构,需要找出一个节点来替换当前节点. 根据二叉树的特点,当前节点大于所有左子树,小于所有右子树, 可以用左子树中最大的节点,或者右子树最小的节点来替换当前节点,然后删除替换节点. // BSTree.h #include <cstdio

【转载】浅谈算法和数据结构: 一 栈和队列

作者:yangecnu(yangecnu's Blog on 博客园) 出处:http://www.cnblogs.com/yangecnu/ 最近晚上在家里看Algorithms,4th Edition,我买的英文版,觉得这本书写的比较浅显易懂,而且“图码并茂”,趁着这次机会打算好好学习做做笔记,这样也会印象深刻,这也是写这一系列文章的原因.另外普林斯顿大学在Coursera 上也有这本书同步的公开课,还有另外一门算法分析课,这门课程的作者也是这本书的作者,两门课都挺不错的. 计算机程序离不开

算法与数据结构基础1:动态数组

恶补算法与数据结构,从很基础的开始,先看动态数组的实现. // array.h #include <iostream> #include <cstring> #include <cstdlib> using namespace std; class Array { public: // ************************************************************************** // 类的四大函数:构造函数.拷贝构

浅谈算法和数据结构: 一 栈和队列

最近晚上在家里看Algorithems,4th Edition,我买的英文版,觉得这本书写的比较浅显易懂,而且"图码并茂",趁着这次机会打算好好学习做做笔记,这样也会印象深刻,这也是写这一系列文章的原因.另外普林斯顿大学在Coursera 上也有这本书同步的公开课,还有另外一门算法分析课,这门课程的作者也是这本书的作者,两门课都挺不错的. 计算机程序离不开算法和数据结构,本文简单介绍栈(Stack)和队列(Queue)的实现,.NET中与之相关的数据结构,典型应用等,希望能加深自己对这

算法和数据结构基础题集(持续更新中)

 注意一题多解,举一反三,从普通算法到最优算法 1.判断一个字符串中的字符是否唯一(即没有重复),不能使用额外的数据结构(使用基本的数据结构) 2.反转一个字符串 3.去掉字符串中的重复字符,不能使用额外的缓存空间 4.判断两个字符串是否是变位词(两个单词字符相同,但是位置不同的单词) 5.写一函数,把字符串的空格替换为%20 6.判断字符串是否是另一个字符串的字串 7.从一个未排序的链表去除重复的项,不允许使用临时的缓存 8.从一个单链表中返回倒数第k个元素 9.删除链表中的给定节点 10

算法与数据结构基础4:C++二叉树实现及遍历方法大全

binary search tree,中文翻译为二叉搜索树.二叉查找树或者二叉排序树.简称为BST. 本文集齐了二叉树的五大遍历算法:先序遍历.中序遍历.后序遍历.深度优先遍历和广度优先遍历(同层遍历也就是深度优先遍历). // BSTree.h #include <cstdio> #include <iostream> #include <stack> #include <queue> using namespace std; // binary sear

算法与数据结构基础5:C++栈的简单实现

堆栈是基于队列的,只需要要稍微改一下就ok了,把代码贴在下面 // Stack.h #include <cstdio> #include <cassert> #include <iostream> using namespace std; class Stack { public: // ************************************************************************** // 类的四大函数:构造函数.拷贝