火車調度c語言,列車時刻表管理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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-16 14:13
下一篇 2024-11-16 14:13

相關推薦

  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演著非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28
  • Python作為中心語言,在編程中取代C語言的優勢和挑戰

    Python一直以其簡單易懂的語法和高效的編碼環境而著名。然而,它最近的發展趨勢表明Python的使用範圍已經從腳本語言擴展到了從Web應用到機器學習等廣泛的開發領域。與此同時,C…

    編程 2025-04-28
  • Python基礎語言

    Python作為一種高級編程語言擁有簡潔優雅的語法。在本文中,我們將從多個方面探究Python基礎語言的特點以及使用技巧。 一、數據類型 Python基礎數據類型包括整數、浮點數、…

    編程 2025-04-28

發表回復

登錄後才能評論