分支限界法解决装载问题之FIFO队列方式的总结

1.先说一下顺序队列来建立数据结构

 

/************************************************************************
顺序队列(循环队列)实现FIFO分支限界法--装载问题把数据结构换了一下,
仅仅把之前的链队列换成了循环队列。其余的函数基本没有变,还有main()函
数根本就没变,只是EnQueue(), Add(), DeQueue()这些涉及到E和bestE的函
数中的某些函数参数由QUEUE *类型变成了int类型。函数调用中的参数根本就
没变,也不用变。在原来的链队列程序中,数据结构定义按照节点来的,每个
节点中有*parent, weigth, LChild, *next。然后一个队列是很多个节点,每次
入队或者出队通过加入含有这些类型元素的节点或者删除,E和bestE是独立的,
不依赖于链队列LQ的具有以上所说类型的节点,每次用来存放某些节点的地址,
只要找到了某个节点地址,就可以调用这个节点里面的*parent, weigth, LChild
等元素,这是链队列的来实现的思想。这里我采用循环队列来实现,顺序队列也
好,循环队列也好,都是顺序的存储方式,即将要存储的数据存到数组里面(数组
是顺序的)。所以思想就跟之前的链队列实现的思想有所不同,原来每个节点有一
个parent, weight,LChild之类的,但是如今只有一个节点SQ。元素的寻找是通过
下标值来寻找也就相当于模拟链队列里面的节点地址,这个下标值可以模拟成地
址。so,weight, parent, LChild每个都是一个数组weight[], parent[], LChild[];
比如链队列中的E->weight表示的是E所指向的那个节点的weight,在循环队列
里面就要用weight[E]来实现了,在链队列中,E是QUEUE*型的,表示的是队列
节点的那种类型,然而在顺序队列里面,就定义成了int型,表示的是下标值,从
1开始(0表示加入空节点weight值为-1时)。再比如,原来的链队列程序中
bestx[j] = bestE->LChild ;bestE = bestE ->parent ;换成了下面的:
bestx[j] = Q->LChild[bestE] ;	bestE = Q->parent[bestE] ;so,可以仔细体味
一下这两种方式的不同。
其实还有一种构建数据结构的方式,也是循环队列或者顺序队列,总是是用数组来
存储元素的。但是那种方式和链队列的思想基本上是一样,按照开辟节点的方式,
唯一不同的是链队列的节点之间不是顺序的,而是通过指针连起来的,而此种方式
确实开辟一个顺序的节点空间Q[100];见下面
struct
{
	int weight;
	int LChild;
	int parent;
}Q[MAXSIZE];
int front, int rear;
这个和链队列方式基本一样weight, LChild, parent都是节点内部的元素。而front, 
rear都是独立的元素,用来指向节点。仔细体味三种队列构建方式的异同。
*******************************************************************************/
#include<stdio.h>
#include<stdlib.h>

#define	MAXSIZE	100
typedef struct 
{
	int weight[MAXSIZE];
	int LChild[MAXSIZE];
	int parent[MAXSIZE];
	int front, rear;
}SEQUEUE;

//只有个全局变量:*bestx,bestw。
int *bestx ;
int bestw = 0 ; // 目前的最优值

void InitQueue(SEQUEUE *SQ)
{
	SQ->front=SQ->rear=0;
	for(int i=0;i<MAXSIZE;i++)
	{
		SQ->parent[i]=-1;
	}
}

int Empty(SEQUEUE *SQ)
{
	if(SQ->rear==SQ->front)
		return 1;
	else
		return 0;
}

int Add(SEQUEUE *SQ, int w, int E, int l)
{
	if((SQ->rear+1)%MAXSIZE==SQ->front)
	{
		printf("队列满了!\n");
		return 0;
	}
	SQ->rear=(SQ->rear+1)%MAXSIZE;
	SQ->weight[SQ->rear]=w;
	SQ->LChild[SQ->rear]=l;
	SQ->parent[SQ->rear]=E;
	return 1;
}

int DeQueue(SEQUEUE *SQ, int *E)
{
	if(Empty(SQ))
	{
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值