IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> C++数据结构-6-队列 -> 正文阅读

[数据结构与算法]C++数据结构-6-队列

一、基本概念

队列是一种只允许在表的一端进行操作的线性表,队列的插入称为入队,队列的删除称为出队;允许入队的一端称为队尾,允许出队的一端称为队头;不含任何元素的队列称为空队列;队列也称为先入先出线性表。本文主要介绍顺序队列和链式栈。
队列

二、基本操作

  1. 创建队列
  2. 删除队列
  3. 判断队列是否为空
  4. 在队尾插入一个元素
  5. 取队头元素的值
  6. 队头元素出队
  7. 输出队列

三、队列的顺序表示及实现

3.1 表示

  1. 采用顺序存储结构的队列称为顺序队列,顺序队列通常用一个一维数组来存放队列中的数据元素。此外,还需要设置两个整型变量front和rear,分别指示队头和队尾,称为头指针和尾指针,front始终指向队头元素,rear始终指向队尾元素。
    队列元素的入队和出队是最基本操作,顺序队列入队时,将新元素插入rear所指位置,再将rear的值加一;出队时,删除front所指位置的元素后,再将front哦值**+1**,并返回被删元素。
    队列满时,再入队则产生上溢,队列为空再出队则产生下溢。
  2. 链式队列是仅在表头删除节点和仅在表尾插入节点的单链表,因为需要在表头进行删除操作和在表尾进行插入操作,所以需要front和rear指针,一个链式队列就可以由front指针和rear指针唯一确定

3.2 问题分析与避免

由于队列经常做插入删除,front和rear会随着操作的深入而发生变化。如下图,当再进行插入,系统会误以为队列已满,造成空间浪费。
假满
为避免出现假上溢问题,充分利用队列空间,可以将顺序队列存储空间的最后一个位置和第一个位置逻辑上链接到一起,这样的队列叫做循环队列。假设队列能够容纳MaxSize个元素,逻辑上的循环是通过头、尾指针的**+1**操作来实现的,再对其进行MaxSize求模运算,即可得出相应的指针位置,保证队列指针位置不发生错误位置索引。

front = (front+1) % MaxSize;
rear = (rear+1) % MaxSize;

如上情形,当还有新元素入队,由于rear指向0,能够进行入队,解决了假上溢问题。当然,仅根据front和rear,无法判断队列是满还是空,因为这两种状态是一样的。要解决这个问题有两种方法:

  1. 约定少用一个元素空间,入队前如果关系(rear+1)%(MaxSize-1)==front,就认为队列是满,再插入就会发生溢出,这种方法,rear指针始终指向那个空闲的元素空间
  2. 使用一个计数器size记录当前队列长度,如果size=0,且front==rear,则当前是空队列,可以进行入队操作,否则,如果队列满的话就不能进行入队操作。

3.3 队列实现

使用C++语言实现的顺序队列和链式队列的实现如下

//顺序队列
#include<iostream>
using namespace std;

template<class T>
class LinearQueue{
	public:
		LinearQueue(int LQMaxSize);
		~LinearQueue();
		bool IsEmpty();
		bool IsFull();
		bool Insert(const T& x);
		bool GetElement(T& x);
		bool Delete(T& x);
		void Output(ostream& out) const;
		
	private:
		int size;
		int MaxSize;
		int front,rear;
		T *element;
};

template<class T>
LinearQueue<T>::LinearQueue(int LQMaxSize){
	MaxSize=LQMaxSize;
	element=new T[MaxSize];
	size=0;
	front=0;
	rear=0;
}
template<class T>
LinearQueue<T>::~LinearQueue(){
	delete []element;
}
template<class T>
bool LinearQueue<T>::IsEmpty(){
	return size==0;
}
template<class T>
bool LinearQueue<T>::IsFull(){
	return size==MaxSize;
}
template<class T>
bool LinearQueue<T>::Insert(const T& x){
	if(IsFull()){
		return false;
	}
	else{
		element[rear]=x;
		rear=(rear+1)%(MaxSize);
		size++;
		return true;
	}
}
template<class T>
bool LinearQueue<T>::GetElement(T& x){
	if(IsEmpty()){
		return false;
	}
	else{
		x=element[front];
		return true;
	}
}
template<class T>
bool LinearQueue<T>::Delete(T& x){
	if(IsEmpty()){
		return false;
	}
	else{
		x=element[front];
		front=(front+1)%(MaxSize);
		size--;
		return true;
	}
}
template<class T>
void LinearQueue<T>::Output(ostream& out) const{
	int index;
	index=front;
	for(int i=0;i<size;i++){
		out<<element[index]<<endl;
		index=(index+1)%MaxSize;
	}
}
template<class T>
ostream& operator<<(ostream& out,LinearQueue<T>& x){
	x.Output(out);
	return out;
}

void PrintSpace(int n,int k){
	for(int i=1;i<=n-k;i++){
		cout<<' ';
	}
}
void YangHui(int n){
	LinearQueue<int> Q(n+2);
	int x,y;
	PrintSpace(n,1);
	cout<<'1'<<endl;
	Q.Insert(0);
	Q.Insert(1);
	Q.Insert(1);
	for(int i=2;i<=n;i++){
		Q.Insert(0);
		PrintSpace(n,i);
		do{
			Q.Delete(x);
			Q.GetElement(y);
			if(y){
				cout<<y<<' ';
			}
			else{
				cout<<endl;
			}
			Q.Insert(x+y);
		}while(y);
	}
	cout<<endl;
}
int main(){
	YangHui(6);
	return 0;
}
//链式队列
#include<iostream>
using namespace std;

template<class T>
class LinkQueue;

template<class T>
class LinkNode{
	friend class LinkQueue<T>;
	
	public:
		LinkNode(){
			next=NULL;
		}
	private:
		T data;
		LinkNode<T> *next;
};

template<class T>
class LinkQueue{
	public:
		LinkQueue();
		~LinkQueue();
		bool IsEmpty();
		bool Insert(const T& x);
		bool GetElement(T& x);
		bool Delete(T& x);
		void Output(ostream& out) const;
	private:
		int size;
		LinkNode<T> *front,*rear;
};
template<class T>
LinkQueue<T>::LinkQueue(){
	front=NULL;
	rear=NULL;
	size=0;
}
template<class T>
LinkQueue<T>::~LinkQueue(){
	T x;
	while(front!=NULL){
		Delete(x);
	}
}
template<class T>
bool LinkQueue<T>::IsEmpty(){
	return size==0;
}
template<class T>
bool LinkQueue<T>::Insert(const T& x){
	LinkNode<T> *p=new LinkNode<T>;
	if(p==NULL){
		return false;
	}
	else{
		p->data=x;
		if(front==NULL){
			rear=p;
			front=p;
		}
		else{
			rear->next=p;
			rear=p;
		}
		size++;
		return true;
	}
}
template<class T>
bool LinkQueue<T>::GetElement(T& x){
	if(IsEmpty()){
		return false;
	}
	else{
		x=front->data;
		return true;
	}
}
template<class T>
bool LinkQueue<T>::Delete(T& x){
	LinkNode<T> *p;
	if(IsEmpty()){
		return false;
	}
	else{
		p=front;
		x=front->data;
		front=front->next;
		delete p;
		size--;
		return true;
	}
}
template<class T>
void LinkQueue<T>::Output(ostream& out) const{
	LinkNode<T> *p;
	p=front;
	for(int i=0;i<size;i++){
		out<<p->data<<endl;
		p=p->next;
	}
}
template<class T>
ostream& operator<<(ostream& out,LinkQueue<T> x){
	x.Output(out);
	return out;
}

void printspace(int n,int k){
	for(int i=1;i<=n-k;i++){
		cout<<' ';
	}
}
void yanghui(int n){
	LinkQueue<int> Q;
	int x,y;
	printspace(n,1);
	cout<<"1"<<endl;
	Q.Insert(0);
	Q.Insert(1);
	Q.Insert(1);
	for(int i=2;i<=n;i++){
		Q.Insert(0);
		printspace(n,i);
		do{
			Q.Delete(x);
			Q.GetElement(y);
			if(y){
				cout<<y<<' ';
			}
			else{
				cout<<endl;
			}
			Q.Insert(x+y);
		}while(y);
	}
	cout<<endl;
}
int main(){
	yanghui(6);
	
	return 0;
}

=队列介绍与实现===

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-11 16:39:00  更:2022-05-11 16:42:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:34:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码