資料結構用佇列實作列車車廂重排
#include "LinkQueue.cpp"
#include <iostream>
using namespace std;
int main()
{
int k,n,leave=1,nowout=1;
cout<<"請輸入緩沖軌的數量:";
cin>>k;
LinkQueue<int> queue[k+1],inqueue,outqueue;
cout<<"請輸入入軌的車廂數量:";
cin>>n;
cout<<"請分別輸入車頭至車尾的車廂編號:";
for(int i=1;i<=n;i++)
{
int num;
cin>>num;
inqueue.EnQueue(num);
}
for(int i=1;i<k;i++)
{
int x;
x=inqueue.DeQueue();
queue[i].EnQueue(x);
while (x<inqueue.GetQueue())
{
x=inqueue.DeQueue();
queue[i].EnQueue(x);
}
}
while(!inqueue.Empty())
{
int neither=1;
if(inqueue.GetQueue()==nowout)
{
int x=inqueue.DeQueue();
outqueue.EnQueue(x);
nowout++;
continue;
}
for (int j=1;j<k;j++)
{
if(queue[j].GetQueue()==nowout)
{
int x=queue[j].DeQueue();
outqueue.EnQueue(x);
nowout++;
neither=0;
if (queue[j].Empty()) leave++;
}
}
if(neither)
{
int exist=0,quenum,num;
for (int j=1;j<k;j++)
{
if(queue[j].Rear()<inqueue.GetQueue())
{
exist=1;
num=queue[j].Rear();
quenum=j;
break;
}
}
if (exist==1)
{
for (int j=quenum;j<k;j++)
if(queue[j].Rear()<inqueue.GetQueue()&&queue[j].Rear()>num)
{
num=queue[j].Rear();
quenum=j;
}
int x=inqueue.DeQueue();
queue[quenum].EnQueue(x);
}
if (exist==0)
{
if(leave>1)
for (int j=1;j<k;j++)
{
if(queue[j].Empty())
{
int x=inqueue.DeQueue();
queue[j].EnQueue(x);
leave--;
}
}
else {cout<<"車廂無法重排";break;}
}
}
}
cout<<"重排后車廂編號依次為:";
while (!outqueue.Empty())
{
cout<<outqueue.DeQueue()<<" ";
}
}
鏈佇列:
#include <iostream>
using namespace std;
template <class DT>
struct Node
{
DT data;
Node<DT> *next;
};
template <class DT>
class LinkQueue
{
public:
LinkQueue();
~LinkQueue(){}
void EnQueue(DT x);
DT DeQueue();
DT GetQueue(){return front->next->data;}
DT Rear(){return rear->data;}
int Empty(){if(front==rear) return 1;else return 0;}
private:
Node<DT> *front, *rear;
};
template <class DT>
LinkQueue<DT>::LinkQueue()
{
Node<DT> *s=new Node<DT>;
s->next=NULL;
front=rear=s;
}
template<class DT>
void LinkQueue<DT>::EnQueue(DT x)
{
Node<DT> *s= new Node<DT>;
s->data=https://bbs.csdn.net/topics/x;
rear->next=s;
rear=s;
}
template <class DT>
DT LinkQueue<DT>::DeQueue()
{
if(rear==front) throw "下溢";
Node<DT> *p=front->next;
DT x=p->data;
front->next=p->next;
if(p->next==NULL) rear=front;
delete p;
return x;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/276335.html
標籤:C語言
上一篇:c語言問題
