顺序队列和链式队列的实现

队列是一种常用的数据结构,它跟栈一样,操作都受到限制,队列只允许从一端进数据,另一端出数据。队列跟栈不同,栈是一种“后进先出”的模式,而队列是一种“先进先出”的操作模式。就好比日常排队一样,先排队的先出,后排队的后出。例如,进入队列的顺序是1,2,3,4,5则出队列的顺序是1,2,3,4,5(只考虑一次性出列的情况)。

队列也分顺序队列和链式队列,跟顺序栈和链表栈一样,顺序队列同样是基于数组实现,链式队列则是基于链表实现。

顺序队列:

//顺序队列

#include <stdio.h>
#define SIZE 10
typedef struct Queue
{
int data[SIZE];
int front;
int tail;
}Queue;
//初始化队列
void init_queue(Queue* qu)
{
qu->front=0;
qu->tail=-1;
}
//判断队列是否为满
int is_queue_empty(Queue* qu)
{
if(qu->tail==-1)
{
return 1;
}
return 0;
}
//判断队列是否为满
int is_queue_full(Queue* qu)
{
if(qu->tail==SIZE-1)
{
return 1;
}
return 0;
}
//获取队首值
int get_topvalue(Queue* qu)
{
if(is_queue_empty(qu))
{
printf("Queue is empty!\n");
return -1;
}
return qu->data[qu->front];
}
//进队列
void in_queue(Queue* qu,int _data)
{
if(is_queue_full(qu))
{
printf("Queue is full!\n");
return ;
}
qu->tail++;
qu->data[qu->tail]=_data;
}
int out_queue(Queue* qu)
{
if(is_queue_empty(qu))
{
printf("Queue is empty!\n");
return -1;
}
int ret_value=qu->data[qu->front];
int i;
for(i=0;i<qu->tail;i++)
{
qu->data[i]=qu->data[i+1];
}
qu->tail--;
return ret_value;
}
//打印队列内的元素
void print_queue(Queue* qu)
{
int i;
for(i=0;i<qu->tail+1;i++)
{
printf("%d\t",qu->data[i]);
}
printf("\n");
}
int main(int argc, char const *argv[])
{
Queue qu;
init_queue(&qu);
in_queue(&qu,1);
in_queue(&qu,23);
in_queue(&qu,5);
in_queue(&qu,3);
in_queue(&qu,6);
printf("get_topvalue:%d\n",get_topvalue(&qu));
//out_queue(&qu);
//print_queue(&qu);
int i;
for(i=0;i<7;i++)
{
printf("%d\t",out_queue(&qu));
}
printf("\n");
return 0;
}

链式队列:

//链式队列
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
	int data;
	struct Node* next;
}Node;
typedef struct Queue
{
	Node* front;
	Node* tail;
}Queue;
//初始化队列
void init_queue(Queue* qu)
{
	qu->front=NULL;
	qu->tail=NULL;
}
//判断队列是否为空
int is_queue_empty(Queue* qu)
{
	if(qu->front==NULL)
	{
		return 1;
	}
	return 0;
}
//获取队首值
int get_front_value(Queue* qu)
{
	if(is_queue_empty(qu))
	{
		printf("Queue is empty!\n");
		return -1;
	}
	return qu->front->data;
}
//入列
void in_queue(Queue* qu,int _data)
{
	Node* newnode=(Node*)malloc(1*sizeof(Node));
	newnode->data=_data;
	newnode->next=NULL;
	if(qu->front==NULL && qu->tail==NULL)
	{
		qu->front=newnode;
		qu->tail=newnode;
	}
	else
	{
		qu->tail->next=newnode;
		qu->tail=newnode;
	}
}
//出列
void out_queue(Queue* qu)
{
	if(is_queue_empty(qu))
	{
		printf("Queue is empty!\n");
		return;
	}
	Node* temp=qu->front;
	qu->front=qu->front->next;
	if(qu->front==NULL)
	{
		qu->tail=NULL;
	}
	free(temp);
	temp=NULL;
}
//打印队列中的值
void print_queue(Queue* qu)
{
	Node* curr=qu->front;
	while(curr)
	{
		printf("%d\t",curr->data);
		curr=curr->next;
	}
	printf("\n");
}
int main(int argc, char const *argv[])
{
	Queue qu;
	init_queue(&qu);
	int i;
	for(i=0;i<10;i++)
	{
		in_queue(&qu,i*2);
	}
	print_queue(&qu);
	printf("get_front_value:%d\n",get_front_value(&qu));
	out_queue(&qu);
	print_queue(&qu);
	printf("get_front_value:%d\n",get_front_value(&qu));
	return 0;
}
时间: 2024-10-16 20:43:33

顺序队列和链式队列的实现的相关文章

数据结构Java实现07----队列:顺序队列&amp;顺序循环队列、链式队列、顺序优先队列

数据结构Java实现07----队列:顺序队列&顺序循环队列.链式队列.顺序优先队列 一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作. 队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头.队列的插入操作通常称作入队列,队列的删除操作通常称作出队列. 下图是一个依次向队列中插入数据元素a0,a1,...,an-

队列(链式队列)

链式队列----用链表实现,链式队列就是一个操作受限的单向链表,如果读者了解单向链表的建立过程,那理解链式队列就很容易了,先回顾一下单向链表的建立过程 (不熟悉单向链表的可以先看看另一片随笔,再回来看链式队列理解起来更容易?https://www.cnblogs.com/lanhaicode/p/10304567.html) 单向链表 单向链表节点的组成部分 1 struct link 2 { 3 int data; 4 struct link *next; 5 }; 数据域:data----用

【数据结构-队列】链式队列

关于链式队列 链式队列又称为链队,是使用单链表实现的,需要一个头指针一个尾指针 结构图: 链队需要的元素组成 /*链式队列的每一个节点*/ struct node{ int data;//存储数据 struct node *next;//指向下一个节点的指针 }; /*链式队列*/ typedef struct{ struct node *head;//头指针 struct node *tail;//尾指针 }LinkedQueue; 创建一个带头节点的空队列 创建一个节点p 将p节点的next

大话数据结构----循环队列和链式队列

队列(Queue) 是只允许在一端进行插入操作,而在另一端进行删除操作的线性表 队列的特点就是:先进先出,和生活中排队的例子是很先进的,排队的目的不就是先到先得吗. 生活中的队列相当于顺序存储的队列,在火车站排队买票,前面的人买完票走了,后面的人一个一个往前移一位,这是很正常的事情,而计算机中队列队列第一个元素出去了,后面的元素一个一个往前移,这是一件很降低效率的一件事.为了解决这种效率问题,计算机采用循环队列的方式操作队数据. 循环队列 队列的头尾相接的顺序存储结构称为循环队列. 1.首先循环

数据结构--顺序循环队列和链式队列

第一部分:顺序循环队列的实现 1 //循环队列的实现 2 #define OK 1 3 #define MAXSIZE_Q 10 4 //#define OVERFLOW -2 5 #define ERROR 0 6 7 typedef int Status; 8 typedef int QElemtype; 9 10 typedef struct{ 11 QElemtype *base; //初始化的动态分配存储空间 12 int front; //队头指针 13 int rear; //队尾

顺序队列和链式队列

#include<iostream> using namespace std; #define ElemType int const int MaxSize=50; typedef struct{ ElemType data[MaxSize]; int front=0,rear=0; }SqQueue; bool EnQueue(SqQueue &Q,ElemType x){ if((Q.rear+1)%MaxSize==Q.front)return false; Q.data[Q.r

JAVA实现数组队列,循环数组队列,链式队列

/** * 文件名:QueueText.java * 时间:2014年10月22日下午9:05:13 * 作者:修维康 */ package chapter3; /** * 类名:ArrayQueue * 说明:队列的数组实现 */ class ArrayQueue<AnyType>{ private static final int DEFAULT_CAPACITY = 10; private int front;//队头 private int rear;//队尾 private int

栈和队列分别的顺序结构和链式结构

栈和队列 栈和队列本身作为特殊的线性表,要记住他俩本身就费劲.难受的是他俩还能分别考虑顺序结构和链式结构,很复杂,容易混淆. 其实比起FILO(先进后出)和FIFO(先进先出)等特点,更重要的是对指针的把握.进出顺序是在逻辑层面的,只要理解就行,难得是如何用指针来表示这种特点,于是我就此方面进行个总结. 顺序栈 虽然栈只需要对一段进行操作(栈顶),但我们除了栈顶指针(top)外,还需要设置栈底指针(base),主要是为了用于判断栈空栈满. s.top == s.base; //当栈顶指针等于栈底

c++实验5 顺序/链式队列

链式队列及循环队列 1.循环队列的实现(请采用模板类及模板函数实现) [实现提示] 同时可参见教材p65-p67页的ADT描述及算法实现及ppt)函数.类名称等可自定义,部分变量请加上学号后3位.也可自行对类中所定义的操作进行扩展. 所加载的库函数或常量定义及类的定义: #include<stdlib.h> #include<iostream> using namespace std; typedef int DataType; class SeqQueue{ private: D