数据结构--3.4队列

基本操作:

入队(enqueue):队尾rear插入
出队(dequeue):队首front删除

实现方式

链表实现:继承自链表结构(本文略)
数组实现:循环数组,只要Rear或者Front达到数组的尾端,他就绕回到开头。

#include <iostream>
using namespace std;
typedef struct QueueRecord
{
	int m_capacity;
	int m_rear;
	int m_front;
	int m_size;
	int* m_arry;
}*Queue;

Queue CreatQueue(int capacity);
void Enqueue(Queue q, int x);
void Dequeue(Queue q);
bool IsFull(Queue q);
bool IsEmpty(Queue q);
void Traverse(Queue q);//队首到队尾遍历
bool IsMakeEmpty(Queue q);
int main()
{
	Queue q = CreatQueue(5);
	Enqueue(q, 1);
	Enqueue(q, 2);
	Enqueue(q, 3);
	Traverse(q);
	cout << "出队一次:" << endl;
	Dequeue(q);
	Traverse(q);
	cout << "将4入队:" << endl;
	Enqueue(q, 4);
	Traverse(q);
	if (IsMakeEmpty(q))
		cout << "置空成功" << endl;
	Traverse(q);
	system("pause");
	return 0;
}

Queue CreatQueue(int capacity)
{
	Queue q = new QueueRecord;
	q->m_capacity = capacity;
	q->m_rear = -1;
	q->m_front = -1;
	q->m_size = 0;
	q->m_arry = new int[capacity];
	return q;
}

void Enqueue(Queue q, int x)
{
	if (!IsFull(q))
	{
		q->m_size++;
		q->m_rear++;
		q->m_arry[q->m_rear] = x;
	}
	else
		cout << "队列已满,无法入队" << endl;
}

void Dequeue(Queue q)
{
	if (!IsEmpty(q))
	{
		q->m_size--;
		q->m_front++;
		q->m_rear--;
	}
	else
		cout << "队列以空,无法出队" << endl;
}

bool IsFull(Queue q)
{
	if (q->m_size == q->m_capacity)
		return true;
	return false;
}

bool IsEmpty(Queue q)
{
	if (q->m_size == 0)
		return true;
	return false;
}

void Traverse(Queue q)
{
	cout << "队首到队尾遍历:" << endl;
	if (!IsEmpty(q))
	{
		int tmp = q->m_size;
		int i = 0;
		while (i < tmp)
		{
			cout << q->m_arry[i] << " ";
			i++;
		}
		cout << endl;
	}
	else
		cout << "队列为空" << endl;
}

bool IsMakeEmpty(Queue q)
{
	if (q != nullptr)
	{
		q->m_size = 0;
		q->m_front = -1;
		q->m_rear = -1;
		return true;
	}
	else
		cout << "不占空间的空栈" << endl;
}

应用:

1、作业送交给打印机;但是打印机可以删除中间的队列,违反了队列的严格定义
但是,放到队列未必最好,有时希望花费时间最长的作业放到最后,此时可以使用堆(优先队列)。
2、PC机的网络设置,磁盘是放在一台叫做文件服务器的机器上,用户是根据先到先使用的原则访问文件,其数据结构为队列
3、接线员对大公司的传呼
4、在终端上的等待也是队列

拓展

排队论:处理这样一类问题,用概率的方法计算用户排队预计等待时间,以及整个队列能够容纳的处理时间。
答案依赖于用户加入队列的概率,以及加入队列后处理服务花费的时间,这两个参数作为概率分布函数给出。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
程序简单模拟一个队列多窗口排队模式设某银行有一个固定能容纳N个顾客的等候区,顾客想进银行,若等候区有空则可进,否则被拒绝进入。每当银行柜员叫号时,等候区中最先进入的顾客离开等候区前往柜台办理业务,若叫号时等候区无人,则此次叫号作废。 1.输入格式 第一行输入一个不大于20的正整数N,表示银行等候区能容纳的人数,接下来用若干行表示依时间顺序先后发生的“顾客想进银行”或“叫号”事件,格式别是:  顾客想进银行,用 In <id> 表示,其中<id>是顾客编号,为不大于100000的正整数;  叫号,用Calling表示。 最后一行是一个#符号,表示输入结束。 注意:  题目输入保证每个顾客的编号是独一无二的,即:不会出现想进银行的顾客与已经在等候区的顾客编号相同的情况。  保证后一个事件一定在前一个事件完成之后才发生,即:不需要考虑事件之间的“同步”问题。 2.输出格式 对于输入的每个事件,按同样顺序在一行内输出事件的结果,格式别是:  顾客想进银行,若顾客进入,则输出 <id> joined. Total:<t> 其中<id>是该顾客的编号,<t>是顾客进入后,等候区的人数  顾客想进银行,若因等候区满而被拒绝,则输出<id> rejected. 其中<id>是该顾客的编号  叫号,若有顾客前往柜台,则输出 <id> called. Total:<t> 其中<id>是该顾客的编号,<t>是顾客去柜台后,等候区的人数  叫号,等候区无人,则输出 No one! 这个是大学初学数据结构所做的一次作业任务,里面还有非常多可以优化的地方。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值