- 主要内容
1、利用栈的基本操作(Sqstack.cpp为已经实现的一个栈),设计一个算法将一个十进制整数转换成十六进制输出。
注意要点:
输出的十六进制有A-F字符的时候,考虑输出的方式(提示:可以统一使用Ascii处理输出)
2、某汽车轮渡口,过江渡船每次能载10辆车过江,过江车辆分为客车类和货车类,上渡船有如下规定:同类车先到先上船;客车先于货车上渡船,且每上4辆客车,才允许上一辆货车;若等待的客车不足4辆,则以货车代替;若无货车等待,允许客车都上船。试设计算法模拟以上渡口管理。
提示:设计三个队列,分别为过江渡渡船队列、客车队列、货车队列。
- 代码模拟实现
第一问代码:
#include<iostream>
using namespace std;
#define null 0
typedef int elemtype;
typedef struct StackNode//链栈
{
elemtype data;
struct StackNode *next;
}StackNode,*linkstack;
int n;//全局变量 存储初始栈数据的个数
void create_push(linkstack &s)//初始化栈
{ linkstack p;
s=null;
cout<<"请输入要存储的数据个数"<<endl;
cin>>n;
cout<<"请输入数据"<<endl;
for(int i=0;i<n;i++)
{
p=new StackNode;
cin>>p->data;
p->next=s;
s=p;
}
}
elemtype a[100];//全局数组 保存遍历数据
void GetElement(linkstack &s)//遍历栈,获取数据
{
linkstack p=s;
for(int i=0;i<n;i++)
{
if(p)
{
a[i]=p->data;
p=p->next;
}else{
break;
}
}
}
void GetH(elemtype x)//递归法将十进制转为十六进制
{
int m;
m=x%16;
if(x!=0)
{
GetH(x/16);
if(m<=9)
{
cout<<m;
}
switch(m)//通过switch语句强行处理输出
{
case 10:
cout<<"A";
break;
case 11:
cout<<"B";
break;
case 12:
cout<<"C";
break;
case 13:
cout<<"D";
break;
case 14:
cout<<"E";
break;
case 15:
cout<<"F";
break;
default:
break;
}
}
}
int main()
{
linkstack s;
create_push(s);//初始化栈
GetElement(s);//获取栈数据
cout<<"十六进制分别为:"<<endl;
for(int i=0;i<n;i++)//十进制转十六进制并输出
{
cout<<a[i]<<":";
GetH(a[i]);
cout<<endl;
}
return 0;
}
第二问代码:
#include<iostream>
using namespace std;
#define MaxSize 10 //最大载车数
#define null 0
typedef struct QNode{
int data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct {
QueuePtr front;//队头指针
QueuePtr rear;//队尾指针
}linkqueue;
void InitQueue(linkqueue &Q)//链队的初始化
{
Q.front=Q.rear=new QNode;
Q.front->next=null;
}
void EnQueue(linkqueue &Q,int e)//入队
{
QueuePtr p=new QNode;
p->data=e;
p->next=null;
Q.rear->next=p;
Q.rear=p;
}
void InitEnQueue(linkqueue &Q)//初始化原始队列
{ int m;
InitQueue(Q);
cin>>m;
cout<<"请输入车号"<<endl;
QueuePtr p;
for(int k=0;k<m;k++)
{
p=new QNode;
cin>>p->data;
p->next=null;
Q.rear->next=p;
Q.rear=p;
}
}
int scanQueue(linkqueue &Q)//扫描队列 获取队列等候车辆数
{
int m=0;
linkqueue p=Q;
while(p.front!=p.rear)
{
m++;
p.front=p.front->next;
}
return m;
}
int DeQueue(linkqueue &Q)//出队
{
int e;
if(Q.front!=Q.rear)
{
e=Q.front->next->data;
Q.front=Q.front->next;
}
return e;
}
int Ferry_Num(linkqueue &bus,linkqueue &truck)//计算渡船总次数
{
int i;//渡船总数
int BusNum=scanQueue(bus);//客车等待总数
int TruckNum=scanQueue(truck);//货车等待总数
if((BusNum+TruckNum)%10==0)
{
i=(BusNum+TruckNum)/10;
}else{
i=(BusNum+TruckNum)/10+1;
}
return i;
}
void Ferry_Manage(linkqueue &bus,linkqueue &truck,linkqueue &ship,int i)//渡口管理
{
int Total_Num=0;//上渡船车辆总数
int Bus_Num=0,Truck_Num=0;//客车、货车上渡船车辆数
for(int j=0;j<i;j++){
while(Total_Num<MaxSize)//上渡船车辆总数小于MaxSize
{
if(Bus_Num<4&&scanQueue(bus)!=0)
{
EnQueue(ship,DeQueue(bus));//上一辆客车
Total_Num++;
Bus_Num++;
}else if (Bus_Num<4&&scanQueue(bus)==0&&scanQueue(truck)!=0)
{
EnQueue(ship,DeQueue(truck));//上一辆货车
Total_Num++;
Truck_Num++;
}else if(Bus_Num>=4&&scanQueue(truck)!=0)
{
EnQueue(ship,DeQueue(truck));//上一辆货车
Total_Num++;
Truck_Num++;
Bus_Num=0;//已上4辆客车 且有货车等待 置0
}else if(Bus_Num>=4&&scanQueue(truck)==0&&scanQueue(bus)!=0)
{
EnQueue(ship,DeQueue(bus));//上一辆客车
Total_Num++;
Bus_Num++;
}else if(scanQueue(truck)==0&&scanQueue(bus)==0)
{
break;//无等待车,跳出循环
}
}Total_Num=0;//总数置0 统计下艘渡船的上车数
}
}
void print_ferry(linkqueue &ship,int i)//打印渡船顺序
{
for(int j=0;j<i;j++)
{
cout<<"第"<<j+1<<"艘渡船登船顺序为:"<<endl;
for(int m=0;m<MaxSize&&scanQueue(ship)!=0;m++) //渡船出队
{
cout<<DeQueue(ship)<<" ";
}
cout<<endl;
}
}
int main()
{ linkqueue bus;//客车队列
linkqueue truck;//货车队列
linkqueue ship;//渡船队列
cout<<"请输入客车等候辆数"<<endl;
InitEnQueue(bus);//初始化客车队列
cout<<"请输入货车等候辆数"<<endl;
InitEnQueue(truck);//初始化货车队列
InitQueue(ship);//初始化渡船队列
int i=Ferry_Num(bus,truck);//渡船总次数
Ferry_Manage(bus,truck,ship,i);//渡口管理
print_ferry(ship,i);//打印渡船顺序
}
- 测试运行结果
第一问测试结果:
第二问测试结果: