利用链式队列(带头节点)解决银行业务队列简单模拟问题(c++)-- 数据结构
题目:
设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客。给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出。
输入格式:
输入为一行正整数,其中第1个数字N(≤1000)为顾客总数,后面跟着N位顾客的编号。编号为奇数的顾客需要到A窗口办理业务,为偶数的顾客则去B窗口。数字间以空格分隔。
输出格式:
按业务处理完成的顺序输出顾客的编号。数字间以空格分隔,但最后一个编号后不能有多余的空格。
输入样例:
8 2 1 3 9 4 11 13 15
输出样例:
1 3 2 9 11 4 13 15
分析:
经详读题目及例题可知,银行业务队列简单模拟问题可以简单看作 a和b 两个队列的问题:每当a队列输出两个元素后,b队列输出一个元素。
代码:
#include<iostream>
#include <malloc.h>
#include<string>
using namespace std; typedef int datatype; //定义结点
typedef struct Q_node{
datatype data;
struct Q_node *next;
}node; //定义队列的链表结构
typedef struct queue{
node *front;//定义队首与队尾指针
node *rear;
}queue; //初始化队列
void initial(queue *qu)
{
qu->front = new node;//申请一个结点作为头节点
qu->front->next = NULL;
qu->rear = qu->front;
} //判断队列是否为空
//0为空,1为非空
int empty(queue *qu)
{
if(qu->front == qu->rear){
return ;
}else return ;
} //删除链式队列中的结点
void dele(queue *qu, datatype *x)
{
if(empty(qu) == ){
//cout<<"队列为空!"<<endl;
return;
}else{
node *p = qu->front->next;
qu->front->next = p->next; if(qu->rear == p){//除头节点外只有一个结点的情况
qu->rear = qu->front;//表示空链式队列
} *x = p->data;
free(p);//释放空间
p = NULL;
}
} //输出链式队列中结点的值
void display(queue *qu, int &flag)
{
datatype x;
if(empty(qu) == ){
// cout<<"The queue is empty!";
flag = ; //当队列为空时,状态flag=0;
return;
}else{
dele(qu, &x);//输出的值x由dele(queue *qu, datatype *x)函数返回
flag = ;
cout<<x; } } //向链式队列中插入一个值为x的结点
void enter(queue *qu, datatype x)
{ node *pNew;
pNew = new node;
if(pNew == NULL){
cout<<"new pNew fail";
}
pNew->data = x;
pNew->next = NULL;
qu->rear->next = pNew;
qu->rear = pNew;
} int main(){
int flag = ;//用flag来标志元素出队时是否成功
int count=;
queue a,b;//定义队列a,b
initial(&a);//初始化队列a,b
initial(&b); int i,n,x;
cin>>n;//输入个数
for(i=; i<n; i++){
cin>>x;
if(x% == ){//若x为偶数,入b队
enter(&b, x);
}else enter(&a, x);//若x为奇数,入a队
} /*每次display队列a或b中的元素后,判断队列 a或b是否为空
若 a队列为空则直接display b队列,反之亦然
*/
for(i=; i<n;){ if(empty(&a) == ){//a队列为空
while(empty(&b) != ){
i++;
display(&b, flag);
if(b.front != b.rear)cout<<" ";
}
}else if(empty(&b) == ){//b队列为空
while(empty(&a) != ){
i++;
display(&a, flag);
if(a.front != a.rear)cout<<" ";
}
} if(count <= ){
display(&a, flag);
if(flag == ){
cout<<" ";
i++;
count++;
}
}else{
display(&b, flag);
if(flag == ){
cout<<" ";
i++;
count = ;
}
} } return ;
}
编程中遇到的困难:
1. 输出元素后判断是否需要输出空格的情况比较复杂:
(1)当a队列空而b队列非空,b队列输出最后一个元素后,不输出空格
(2)当a队列空而b队列非空,b队列输出最后一个元素后,不输出空格
(3)当没有成功display时,不输出空格
解决方法:定义一个flag变量,输出空格时flag = 1,不输出时flag = 0。通过flag值判断是否输出空格。
2. a队列和b队列中元素个数的不同而导致多种情况(复杂算法可能造成运行超时):
(1) 仅有a队列中有元素
(2) 仅有b队列中有元素
(3) a队列中元素比b队列中元素多(即输入样例)
(4) a队列中元素比b队列中元素少(该种情况需特别留意)
解决方法:多方面考虑,找到一个通用的较好算法。
总结:
1. 在入门者初学中,学习由链表搭建的数据结构都比较困难,但是学习的过程总需要走出安逸圈,选择一个不熟悉的知识点不断巩固,才能有效地为日后学习打下基础。
2. 一个看似简单的问题(尤其是实际问题),往往有多种需要注意和考虑的情况
参考资料:
https://blog.csdn.net/minamiximawa/article/details/81559066
利用链式队列(带头节点)解决银行业务队列简单模拟问题(c++)-- 数据结构的更多相关文章
- 数据结构(C语言版)---第三章栈和队列 3.4.2 队列的链式表示和实现(循环队列)
这个是循环队列的实现,至于串及数组这两章,等有空再看,下面将学习树. 源码如下: #include <stdio.h> #include <stdlib.h> #define ...
- C语言 队列 链式结构 实现
一个C语言链式结构实现的队列 mQueue (GCC编译). /** * @brief C语言实现的链式队列 * @author wid * @date 2013-10-31 * * @note 若代 ...
- 数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...
- C++实现链队类——合肥工业大学数据结构实验5:链式队列
实验5 5.1 实验目的 熟练掌握队列的顺序链式存储结构. 熟练掌握队列的有关算法设计,并在链队列上实现. 根据具体给定的需求,合理设计并实现相关结构和算法. 5.2 实验要求 5.2.1链队列实验要 ...
- 数据结构----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...
- 数据结构队列的java实现,包括线性和链式两种方式
实现的思路为: 采用泛型的方式,首先定义了一个Queue的接口,然后通过实现该接口实现了线性和链式的两种形式的队列: 接口代码如下: package com.peter.java.dsa.interf ...
- 算法与数据结构(二) 栈与队列的线性和链式表示(Swift版)
数据结构中的栈与队列还是经常使用的,栈与队列其实就是线性表的一种应用.因为线性队列分为顺序存储和链式存储,所以栈可以分为链栈和顺序栈,队列也可分为顺序队列和链队列.本篇博客其实就是<数据结构之线 ...
- poj-1459-最大流dinic+链式前向星-isap+bfs+stack
title: poj-1459-最大流dinic+链式前向星-isap+bfs+stack date: 2018-11-22 20:57:54 tags: acm 刷题 categories: ACM ...
- Java实现线性表-顺序表示和链式表示
顺序表示和链式表示的比较: 1.读写方式:顺序表可以顺序存取,也可以随机存取:链表只能从表头顺序存取元素: 2.逻辑结构与物理结构:顺序存储时,逻辑上相邻的元素其对应的物理存储位置也相邻:链式存储时, ...
随机推荐
- 第四次作业 重写equals方法
使用上几次用到得User实体类,在其中重写equals方法. @Override public boolean equals(Object obj) { if(obj==null)return fal ...
- .NET Core 环境下使用命令行移除某个 nuget 包的具体方法
.NET Core 使用Nuget包一般是先写入csproj文件,然后下载保存在\bin\Debug\netcoreapp2.0\publish\下,所以可以采用如下方案进行删除操作(其中netcor ...
- 乘风破浪:LeetCode真题_026_Remove Duplicates from Sorted Array
乘风破浪:LeetCode真题_026_Remove Duplicates from Sorted Array 一.前言 我们这次的实验是去除重复的有序数组元素,有大体两种算法. 二.Remo ...
- 拉格朗日插值和牛顿插值 matlab
1. 已知函数在下列各点的值为 0.2 0.4 0.6 0.8 1.0 0.98 0.92 0.81 0.64 0.38 用插值法对数据进行拟合,要求给出Lagrange插值多项式和Newto ...
- Java读取json文件并对json数据进行读取、添加、删除与修改操作
转载:http://blog.csdn.net/qing_yun/article/details/46865863#t0 1.介绍 开发过程中经常会遇到json数据的处理,而单独对json数据进行 ...
- Flex 布局知识点梳理
传统的布局方案,在针对特殊布局时会很不方便,比如垂直居中,把一个容器等分为N列等等.自从 Flex 出现以后,这些都迎刃而解了,本文对Flex相关内容做一个简单梳理. 什么是 Flex Flex 是 ...
- 有关于分布式缓存Hazelcast
如果在内网段中部署或者启动缓存服务.不能存在相同的组名称.如同使用dubbo一样,会导致无法连接到缓存节点
- node+koa中转层开发实践总结
node中转层的意义: 1.能解决前后端代码部署在不同服务器下时的跨域问题.(实现) 2.合并请求,业务逻辑处理.(实现) 3.单页应用的首屏服务端渲染.(暂未实现) 环境准备: node: ^8.1 ...
- initialProps被React-Navigation的navigation属性覆盖解决方案
怎么开场对我来说一个是个很纠结的问题,Emmm这应该算个好开场. 最近在做一个RN的app端调试工具,在把它嵌入原生app中的时候遇到了一个问题,RN组件里面接受不到原生传过来的initialProp ...
- day2-课堂代码
# 字符串常用属性和操作 # a = 'aa' # b = 'bb' # c = 'cc' # d = a + b + c # print(d) # age = 50 # print('田老师的年龄是 ...