队列

队列也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。
每个元素必然按照进入的次序离队,所以又把队列称为先进先出表(First In First Out,简称FIFO)

链式队列存储结构也是通过由结点构成的单链表实现的。

队列

#include<iostream>
using namespace std;


//结点类型定义
class Node{
public:
	int data;
	Node *next;
};

//定义链队类型,由队头指针front和队尾指针rear组成
//为了运算方便,可在队头节点前增加一个头节点,并将front指向头结点,这样若链队为空,则头指针和尾指针均指向头结点(front==rear)
class Queue{
public:
	Node *front,*rear;
};


/*
	链队的插入和删除操作同样不需要比较和移动元素,只需修改相关指针和进行结点动态分配和回收操作,时间复杂度O(1)
	使用链队不存在队满问题,因为它使用的结点是动态分配的,只要内存中动态存储区仍有可用空间,就可以得到新结点插入链队

*/

//   1.初始化链队列

void init_queue(Queue *lq){
	//初始化链队,即把队头和队尾指针置空
	lq->front = new Node;
	lq->front->next = NULL;
	lq->rear = lq->front;
}

//   2.判断链队是否为空

bool is_empty(Queue *lq){
	//若链队为空,返回1,否则返回0
	if(lq->front == lq->rear)
		return 1;
	else
		return 0;
}

//   3.取队头元素

int front(Queue *lq){
	if(is_empty(lq)) {   //若链队为空,则终止执行,并返回0
		cout<<"Linked queue is empty!\n";
		return 0;
	}
	else
		return (lq->front->next->data);
}

//   4.链队的入队

void insert(Queue *lq, int x){   //把新元素x插入链队的尾端
	Node *p;
	p = new Node;        //步骤1:申请一个由P指针指向的新结点
	p->data = x;		 //步骤2:把x的值赋给新结点的值域
	p->next = NULL;		 //步骤3:把新节点的指针域置空
	lq->rear->next = p;  //步骤4:修改队尾节点的指针
	lq->rear = p;        //步骤5:修改队尾指针使之指向新的队尾结点
}

//   5.链队的出队
//从链队中删除队头元素
bool pop(Queue *lq){ 
	if(is_empty(lq)){   //如果链队为空,则终止执行,并返回0  
		cout<<"Linked queue is empty!\n";
		return 0;    //出队不成功,返回0
	}
	else{
		Node *p;
		p = lq->front->next;  //暂存队头指针,以便回收队头结点
		if(p == lq->rear){    //如果只有一个结点,出列后链队为空
			lq->front = lq->rear; 
		}
		else{                 
			lq->front->next = p->next;  //修改指针
			delete (p);        //回收空间
			return 1;       //出队成功,返回1
		}
	}
}


int main()
{
 
	return 0;
}



—— 生命的意义,在于赋予它意义。

原创 http://blog.csdn.net/shuangde800 By D_Double




你可能感兴趣的:(队列)