编程实现队列的入队、出队、测长、打印
来源:互联网 发布:淘宝购物 编辑:程序博客网 时间:2024/04/30 02:52
队列的定义及基本运算
1、定义
队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表
(1)允许删除的一端称为队头(Front)。
(2)允许插入的一端称为队尾(Rear)。
(3)当队列中没有元素时称为空队列。
(4)队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表。
队列的修改是依先进先出的原则进行的。新来的成员总是加入队尾(即不允许"加塞"),每次离开的成员总是队列头上的(不允许中途离队),即当前"最老的"成员离队。
注意:我们用单链表来实现队列:链表头元素为对头(Front),链表尾部为队尾(Rear)!!!。
【例】在队列中依次加入元素a1,a2,…,an之后,a1是队头元素,an是队尾元素。退出队列的次序只能是a1,a2,…,an。
运行结果如下所示:
/*017编程实现队列的入队、出队、测长、打印*/
#include <stdio.h>
#include <malloc.h>
#include <stdio.h>
#include <malloc.h>
/*队列的实现可以用链表或数组,本例用单链表来实现队列*/
typedef struct _Node
{
int data;
struct _Node *next; /*指向链表下一个指针*/
}node;
typedef struct _Node
{
int data;
struct _Node *next; /*指向链表下一个指针*/
}node;
typedef struct _Queue
{
/*node表示队列中的每个节点元素,My Queue表示队列*/
node *front; /*队头*/
node *rear; /*队尾*/
}MyQueue;
{
/*node表示队列中的每个节点元素,My Queue表示队列*/
node *front; /*队头*/
node *rear; /*队尾*/
}MyQueue;
/*在进行编程之前,首先要构造一个空的队列*/
MyQueue *CreateMyQueue()
{
MyQueue *q = (MyQueue *)malloc(sizeof(MyQueue)); /*新建一个队列*/
q->front = NULL; /*把队首指针置空*/
q->rear = NULL; /*把队尾指针置空*/
return q;
}
MyQueue *CreateMyQueue()
{
MyQueue *q = (MyQueue *)malloc(sizeof(MyQueue)); /*新建一个队列*/
q->front = NULL; /*把队首指针置空*/
q->rear = NULL; /*把队尾指针置空*/
return q;
}
/*入队,从队尾一端插入节点*/
MyQueue *enqueue(MyQueue *q , int data)
{
node *newP = NULL;
newP = (node *)malloc(sizeof(node)); /*新建节点*/
newP->data = data; /*复制节点数据*/
newP->next = NULL;
MyQueue *enqueue(MyQueue *q , int data)
{
node *newP = NULL;
newP = (node *)malloc(sizeof(node)); /*新建节点*/
newP->data = data; /*复制节点数据*/
newP->next = NULL;
if(q->rear == NULL)
{
/*若队列为空,新节点既是队首又是队尾*/
q->front = q->rear = newP;
}
else
{
/*队列不为空,新节点放到队尾,队尾指针指向新节点*/
q->rear->next = newP;
q->rear = newP;
}
return q;
}
{
/*若队列为空,新节点既是队首又是队尾*/
q->front = q->rear = newP;
}
else
{
/*队列不为空,新节点放到队尾,队尾指针指向新节点*/
q->rear->next = newP;
q->rear = newP;
}
return q;
}
/*出队,从队头一端删除节点*/
MyQueue *dequeue(MyQueue *q)
{
node *pnode = NULL;
pnode = q->front; /*指向队头*/
if(pnode == NULL)
{
printf("Empty queue!\n");
}
else
{
q->front = q->front->next; /*新队头*/
if(q->front == NULL) /*若删除后队列为空时,对rear置空*/
{
q->rear = NULL;
}
free(pnode); /*删除原队头节点*/
}/*如果要得到被删除的节点,可以不释放内存并且返回此节点*/
MyQueue *dequeue(MyQueue *q)
{
node *pnode = NULL;
pnode = q->front; /*指向队头*/
if(pnode == NULL)
{
printf("Empty queue!\n");
}
else
{
q->front = q->front->next; /*新队头*/
if(q->front == NULL) /*若删除后队列为空时,对rear置空*/
{
q->rear = NULL;
}
free(pnode); /*删除原队头节点*/
}/*如果要得到被删除的节点,可以不释放内存并且返回此节点*/
return q;
}
}
/*队列的测长*/
int GetLength(MyQueue *q)
{
int nlen = 0;
node *pnode = q->front; /*指向队头*/
if(pnode != NULL) /*队列不能为空*/
{
nlen = 1;
}
/*注意在代码中,循环结束的条件是"pnode != q->rear",而不应该与NULL做比较,即"pnode != NULL",
这是因为队尾有可能指向的不是一个链表的末节点*/
while(pnode != q->rear)
{
/*遍历队列*/
pnode = pnode->next;
nlen++; /*遍历一次nlen递增1*/
}
int GetLength(MyQueue *q)
{
int nlen = 0;
node *pnode = q->front; /*指向队头*/
if(pnode != NULL) /*队列不能为空*/
{
nlen = 1;
}
/*注意在代码中,循环结束的条件是"pnode != q->rear",而不应该与NULL做比较,即"pnode != NULL",
这是因为队尾有可能指向的不是一个链表的末节点*/
while(pnode != q->rear)
{
/*遍历队列*/
pnode = pnode->next;
nlen++; /*遍历一次nlen递增1*/
}
return nlen;
}
}
/*队列的打印*/
void PrintMyQueue(MyQueue *q)
{
node *pnode = q->front;
if(pnode == NULL)
{
/*队列为空*/
printf("Empty Queue!\n");
return;
}
void PrintMyQueue(MyQueue *q)
{
node *pnode = q->front;
if(pnode == NULL)
{
/*队列为空*/
printf("Empty Queue!\n");
return;
}
printf("data: ");
while(pnode != q->rear) /*遍历队列*/
{
printf("%d " , pnode->data); /*打印节点数据*/
pnode = pnode->next;
}
printf("%d " , pnode->data); /*打印队尾节点数据*/
}
while(pnode != q->rear) /*遍历队列*/
{
printf("%d " , pnode->data); /*打印节点数据*/
pnode = pnode->next;
}
printf("%d " , pnode->data); /*打印队尾节点数据*/
}
int main()
{
int nlen = 0;
MyQueue *hp = CreateMyQueue(); /*建立队列*/
enqueue(hp , 1); /*入队1234*/
enqueue(hp , 2);
enqueue(hp , 3);
enqueue(hp , 4);
nlen = GetLength(hp); /*获得队列长度*/
printf("nlen = %d\n" , nlen);
PrintMyQueue(hp); /*打印队列数据*/
dequeue(hp); /*出队两次*/
dequeue(hp);
nlen = GetLength(hp); /*再次获得队列长度*/
printf("\nnlen = %d\n" , nlen);
PrintMyQueue(hp); /*再次打印队列数据*/
printf("\n");
return 0;
}
{
int nlen = 0;
MyQueue *hp = CreateMyQueue(); /*建立队列*/
enqueue(hp , 1); /*入队1234*/
enqueue(hp , 2);
enqueue(hp , 3);
enqueue(hp , 4);
nlen = GetLength(hp); /*获得队列长度*/
printf("nlen = %d\n" , nlen);
PrintMyQueue(hp); /*打印队列数据*/
dequeue(hp); /*出队两次*/
dequeue(hp);
nlen = GetLength(hp); /*再次获得队列长度*/
printf("\nnlen = %d\n" , nlen);
PrintMyQueue(hp); /*再次打印队列数据*/
printf("\n");
return 0;
}
- 编程实现队列的入队、出队、测长、打印
- 编程实现队列的入队、出队、测长、打印
- 编程实现队列的入队、出队、测长、打印
- 12编程实现队列的入队、出队、测长、打印
- 队列的入队,出队,测长,打印操作
- 队列的入队,出队,测长,打印操作 .
- 程序员面试宝典(第三版)--队列的建立,测长,打印,入队,出队
- 顺序队列基本操作的实现----入队、出队、打印
- 编程实现队列入队出队操作
- 编程实现队列的入队/出队操作
- 编程实现队列的入队/出队操作
- 队列的入队、出队操作实现
- 队列的创建、入队、出队、打印、统计队列长度
- 链队列的初始化、入队、出队及打印(数据结构)
- 新手讲队列:编程实现队列的入队出队操作
- 数据结构 队列入队,出队编程的例子
- 编程实现顺序队列的入队操作和出队操作,并将出队结果输出
- 利用两个栈实现队列的入队出队
- C++Builder 中如何修改服务描述
- append.pl
- 高版本Opencv内置的videoInput库的使用方法(2)
- android in practice_Working with a custom ContentProvider(MyMoviesContentProvider)
- ZIPF分布、PARETO分布和幂律分布
- 编程实现队列的入队、出队、测长、打印
- 32位Ubuntu 11.10下android2.3.7源码下载与编译小结
- _RecordsetPtr 中关于pRst变量的函数调用
- C++ 案例指导(2)C++数据类型及运算符
- Halcon 连接 pointgrey 双目相机
- 约瑟夫环问题两解
- JAVA正则表达式,matcher.find()和 matcher.matches()的区别
- 调试: 删除vs2008项目历史记录
- Hibernate高效查询,只查询部分/指定字段