关于上述问题的解决

             

关于上述问题呢,经过思考,我觉得可以用队列来实现,队列的概念是什么我想我就不在赘述了吧,任何一本数据结构课本上都会有,队列实际上和我们现实生活中的队列是一样的,只是不能像生活中的队伍一样可以插队,或者中途离去。

其实我想解决的方法是广度优先算法,其中队列只是存储的数据结构。先遍历同一层深度的文件夹,然后将这一层文件夹的子文件夹再入队,这个操作一直进行下去,直到最后一个文件夹。

这个队列是一个循环队列,因为伴随着程序的运行,有元素不断的入队,有元素不断的出队,如果文件夹足够多,那么总是会出现队列被用尽的情况,其实这种用尽并不是真的用尽,而是前面的很多的空间并没有用,造成了空间的浪费,那么我们可以用循环的方法来实现,来制造一个循环队列,但是这会出现一种情况,队列为空时,front=rear,而队列为满的时候也是front=rear;这样我们牺牲一个存储单元来实现这个判断,即:(rear+1)%MAXSIZE==front时为满,front==rear时为空。出队时:  front=(front+1)/MAXSIZE,入队时:rear=(rear+1)/MAXSIZE。

下面给出队列的实现代码,首先声明的是这个队列并不是适合所有情况,这个队列是有针对性的,只是适用我这个问题的解决。

代码:// Queue.h: interface for the Queue class.
//
//


class Queue 
{
private:
 typedef struct _FILENAME{
    TCHAR filename[50];
    }FILENAME;
 INT front;
 INT rear;
 INT QueueSize;
 FILENAME *FileName;
public:
 BOOL QueueFull();
 BOOL DeleteQueue();
 BOOL OutQueue(TCHAR *str);
 BOOL InQueue(TCHAR *str);
 BOOL QueueEmpty();
 BOOL ClearQueue();
 BOOL InitQueue(INT size);
 Queue();
 virtual ~Queue();

};
// Queue.cpp: implementation of the Queue class.
//
//

#include "Queue.h"

//
// Construction/Destruction
//

Queue::Queue()
{

}

Queue::~Queue()
{
 DeleteQueue();
}

BOOL Queue::InitQueue(INT size)
{
 QueueSize=size;
 FileName=new FILENAME [QueueSize];
 front=0;
 rear=0;
/* for(front=0;front<10;front++)
  strcpy(FileName[front].filename,"MoJu");
 for(rear=0;rear<10;rear++)
  printf("%s/n",FileName[rear].filename);
*/
 return TRUE;
}

BOOL Queue::ClearQueue()
{
 front=0;
 rear=0;
 return TRUE;
}

BOOL Queue::QueueEmpty()
{
 if(rear==front)
  return TRUE;
 else
  return FALSE;
}

BOOL Queue::InQueue(TCHAR *str)
{
 if(QueueFull())
  {
  MessageBox(NULL,"The Queue is full!!!","ERROR",MB_OK|MB_ICONERROR);
  return FALSE;
  }
 strcpy(FileName[rear].filename,str);

 rear=(rear+1)%QueueSize;

 return TRUE;
}

BOOL Queue::OutQueue(TCHAR *str)
{
 if(QueueEmpty())
  {
  MessageBox(NULL,"The Queue is empty!!!","ERROR",MB_OK|MB_ICONERROR);
  return FALSE;
  }
 strcpy(str,FileName[front].filename);

 front=(front+1)%QueueSize;

 return TRUE;
}

BOOL Queue::DeleteQueue()
{
 if(FileName)
  delete [] FileName;
 FileName=NULL;

 return TRUE;
}

BOOL Queue::QueueFull()
{
 if((rear+1)%QueueSize==front)
  return TRUE;
 else
  return FALSE;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值