本文目錄一覽:
- 1、數據結構 有關棧 火車調度的編程 用C語言 要快!!!
- 2、車廂調度 c語言 數據結構
- 3、火車進站出站後重新組合 編寫c語言判斷能否編排需要的順序。c語言大神幫幫忙
- 4、用C語言編程,利用共享棧,實現火車車廂的調度模擬,如輸入”BBACBCAABCAA”,要求輸出”CCCBBBBAAAAA”
- 5、車廂調度 代碼 C語言版 看清題在答
數據結構 有關棧 火車調度的編程 用C語言 要快!!!
本來想寫寫的,不過看你好像是在應付作業,還是算了吧,我不做害人的事。一不小心就灌水了,對不起,o(∩_∩)o…
你上大學了吧,不容易啊,何必這麼墮落,多學點東西才對的起自己,對的起父母,對的起將來。
車廂調度 c語言 數據結構
void S(Stack S1, Stack S2, Stack S3) {
// 已知三個棧的初始狀態為:S2和S3為空棧, 棧S1中從棧頂到棧底依次存放元素1至n,
// 本函數利用三個棧求得元素1至n 經入棧到出棧可能得到的所有排列。
// 遞歸的終結狀態是S1棧和S2棧均為空棧。
if(StackEmpty(S1) StackEmpty(S2)
從棧底到棧頂輸出棧S3中所有元素;
else{
if (!StackEmpty(S1)) {
Pop(S1, e); Push(S2, e);
S(S1, S2, S3);
Pop(S2, e); Push(S1, e);
}
if (!StackEmpty(S2)) {
Pop(S2, e); Push(S3, e);
S(S1, S2, S3);
Pop(S3, e); Push(S2, e);
}
}
}// S
從網上搜到的,老實說,我也看不懂
火車進站出站後重新組合 編寫c語言判斷能否編排需要的順序。c語言大神幫幫忙
#include stdio.h
#define N 1000
struct stack {
int top;
int data[N];
};
int push(struct stack *s, int number)
{
if(s-top = N-1)
return -1;
s-data[++s-top] = number;
return s-top;
}
int pop(struct stack *s)
{
if(s-top == -1)
return -1;
return(s-data[s-top–]);
}
void pushpop(int train[])
{
int i, j=1; // j代表從A軌道中的車廂,從1到N順序排列
struct stack buffer; // 保存進入車站的車廂
buffer.top = -1; // 堆棧為空時,top=-1
for(i = 0; i N train[i] != 0; i++) {
if(buffer.top=0 buffer.data[buffer.top] == train[i]) {
pop(buffer); // 如果車站中最上面的車廂號就是下一個要排在B軌道上的車廂,將其移到B軌道中
continue;
}
while(train[i] != j) {
push(buffer, j++); // 如果A軌道中當前的第一個車廂不是進入B軌道上的下一個車廂,就將它移到車站裡,繼續比較A軌道中的下一個車廂
if(j = N) // 如果A軌道中所有的車廂都空了,就結束
break;
}
if(j = N) // 如果A軌道中所有的車廂都空了,就結束
break;
else if(train[i] == j) // 如果A軌道中當前的第一個車廂就是B軌道中的下一個車廂,就將它移到B軌道中
j++;
}
if(train[i] == 0 || buffer.top == -1) // 如果所有的車廂都比較過之後,buffer是空的,說明能排成需要的順序
printf(“Yes\n”);
else
printf(“No\n”);
}
main()
{
int train[N], i; //train中保存的是B軌道上的車廂序列
printf(“Input\n”);
// 問題中的第一行輸入沒有用,就去掉了
for(i=0; iN; i++) {
scanf(“%d”, train+i);
if(train[i] == 0)
break;
}
pushpop(train);
}
用C語言編程,利用共享棧,實現火車車廂的調度模擬,如輸入”BBACBCAABCAA”,要求輸出”CCCBBBBAAAAA”
用兩個輔助棧,將C和B push進去,Apush進入共享棧的另一端,再將B和C依次放進去!題目不難,耐心點就好
車廂調度 代碼 C語言版 看清題在答
c++的代碼就有,C語言的只幫你找了這個,你看看是否合適【分析】 為了重排車廂,需從前至後依次檢查入軌上的所有車廂。如果正在檢查的車廂就是下一個滿足排列要求的車廂,可以直接把它放到出軌上去。如果不是,則把它移動到緩衝鐵軌上,直到按輸出次序要求輪到它時才將它放到出軌上。緩衝鐵軌是按照LIFO的方式使用的,因為車廂的進和出都是在緩衝鐵軌的頂部進行的。在重排車廂過程中,僅允許以下兩種移動:
①車廂可以從入軌的前部(即右端)移動到一個緩衝鐵軌的頂部或出軌的左端。
②車廂可以從一個緩衝鐵軌的頂部移動到出軌的左端。
考察圖2-18。3號車廂在入軌的前部,但由於它必須位於1號和2號車廂的後面,因此不能立即輸出3號車廂,可把3號車廂送入緩衝鐵軌H1。下一節車廂是6號車廂,也必須送入緩衝鐵軌。如果把6號鐵軌送入H1,那麼重排過程將無法完成,因為3號車廂位於6號車廂的後面,而按照重排的要求,3號車廂必須在6號車廂之前輸出。因此可把6號車廂送入H2。下一節車廂是9號車廂,被送入H3,因為如果把它送入H1或H2,重排過程也將無法完成。請注意:當緩衝鐵軌上的車廂編號不是按照從頂到底的遞增次序排列時,重排任務將無法完成。至此,緩衝鐵軌的當前狀態如圖2-19a所示。
圖2-19 緩衝鐵軌中間狀態
接下來處理2號車廂,它可以被送入任一個緩衝鐵軌,因為它能滿足緩衝鐵軌上車廂編號必須遞增排列的要求,不過,應優先把2號車廂送入H1,因為如果把它送入H3,將沒有空間來移動7號車廂和8號車廂。如果把2號車廂送入H2,那麼接下來的4號車廂必須被送入H3,這樣將無法移動後面的5號、7號和8號車廂。新的車廂u應送入這樣的緩衝鐵軌:其頂部的車廂編號v滿足vu,且v是所有滿足這種條件的緩衝鐵軌頂部車廂編號中最小的一個編號。只有這樣才能使後續的車廂重排所受到的限制最小。我們將使用這條分配規則(assignment
rule)來選擇緩衝鐵軌。
接下來處理4號車廂時,三個緩衝鐵軌頂部的車廂分別是2號、6號和9號車廂。根據分配規則,4號車廂應送入H2。這之後,7號車廂被送入H3。圖2-19b給出了當前的狀態。接下來,1號車廂被送至出軌,這時,可以把H1中的2號車廂送至出軌。之後,從H1輸出3號車廂,從H2輸出4號車廂。至此,沒有可以立即輸出的車廂了。
接下來的8號車廂被送入H1,然後5號車廂從入軌處直接輸出到出軌處。這之後,從H2輸出6號車廂,從H3輸出7號車廂,從H1輸出8號車廂,最後從H3輸出9號車廂。
對於圖2-19a的初始排列次序,在進行車廂重排時,只需三個緩衝鐵軌就夠了,而對於其他的初始次序,可能需要更多的緩衝鐵軌。例如,若初始排列次序為1,n,n-1,…,2,則需要n-1個緩衝鐵軌。
為了實現上述思想,用k個鏈表形式的堆棧來描述k個緩衝鐵軌。之所以採用鏈表形式的堆棧而不是公式化形式的堆棧,原因在於前者僅需要n-1個元素。函數Railroad用於確定重排n個車廂,它最多可使用k個緩衝鐵軌並假定車廂的初始次序為p[1:n]。如果不能成功地重排,Railroad返回false,否則返回true。如果由於內存不足而使函數失敗,則引發一個異常NoMem。
函數Railroad在開始時創建一個指向堆棧的數組H,H[i]代表緩衝鐵軌i,1≤i≤k。NowOut是下一個欲輸出至出軌的車廂號。minH是各緩衝鐵軌中最小的車廂號,minS是minH號車廂所在的緩衝鐵軌。
在for循環的第i次循環中,首先從入軌處取車廂p[i],若p[i]=NowOut,則將其直接送至出軌,並將NowOut的值增1,這時,有可能會從緩衝鐵軌中輸出若干節車廂(通過while循環把它們送至出軌處)。如果p[i]不能直接輸出,則沒有車廂可以被輸出,按照前述的鐵軌分配規則把p[i]送入相應的緩衝鐵軌之中。
【解答】
Railroad(int p[],int n,int k)
{
∥k個緩衝鐵軌,車廂初始排序為p[1:n]
∥如果重排成功,返回1,否則返回0
∥創建與緩衝鐵軌對應的堆棧
LinkedStackint*H;
H=new LinkedStackint[k+1];
int NowOut=1; ∥下一次要輸出的車廂
int minH=n+l; ∥緩衝鐵軌中編號最小的車廂
int minS; ∥minH號車廂對應的緩衝鐵軌
∥車廂重排
for(int i=1;i=n;i++)
if(p[i]==NowOut){∥直接輸出t
printf(“Move car %d from input to output.\\n”,p[i]);
NowOut++;
∥從緩衝鐵軌中輸出
while(minH==NowOut){
Output(minH,minS,H,k,n);
NowOut++;
}
}
else{ ∥將p[i]送入某個緩衝鐵軌
if(!Hold(p[i],minH,minS,H,k,n))
return 0;
}
return 1;
}
下面分別給出了Railroad中所使用的函數Output和Hold。Output用於把一節車廂從緩衝鐵軌送至出軌處,它同時將修改minS和minH。函數Hold根據車廂分配規則把車廂c送入某個緩衝鐵軌,必要時,它也需要修改minS和minH。
void Output(int minH,int minS,LinkedStackintH[],int k,int n)
{
∥把車廂從緩衝鐵軌送至出軌處,同時修改minS和minH
int c;∥車廂索引
∥從堆棧minS中刪除編號最小的車廂minH
H[minS].Delete(c);
printf(“Move car %d from holding track %d to output.\\n”,minH,minS);
∥通過檢查所有的棧頂,搜索新的minH和minS
minH=n+2;
for(int i=1;i=k;i++)
if(!H[i].IsEmpty()(c=H[i].Top())minH){
minH=c;
minS=i;
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/154596.html