栈和队列的实现(数据结构)

文章讲述了如何使用栈实现十进制转十六进制,以及如何用队列模拟汽车轮渡口的渡船管理和车辆调度规则。涉及栈的操作如创建、遍历和递归转换,以及队列的初始化、入队、出队和扫描队列功能。
摘要由CSDN通过智能技术生成
  • 主要内容

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);//打印渡船顺序 
}
  • 测试运行结果

        第一问测试结果:

        第二问测试结果:

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值