CG2925 特殊的資料結構

2021-08-31 21:39:49 字數 4186 閱讀 2620

【問題描述】棧和佇列是兩種最常用的資料結構。本題設計了一種特殊的資料結構,如圖所示,它有兩個入口,左邊的入口記為l,右邊的入口記為r,有乙個出口。約定只能從入口讀入資料,從出口輸出資料(相當於兩個佇列共用乙個出口,這兩個佇列也記為l和r)。

另外,約定該資料結構處理資料的模式為

單位時間內兩個入口要麼同時讀入乙個正整數,要麼只有乙個入口讀入乙個正整數。

在第1個單位時間內,從出口輸出l佇列首的資料,在下乙個單位時間內輸出r佇列首的資料,依次交替。如果這個過程中某個隊列為空,則該單位時間內轉而從另乙個佇列中輸出資料,下乙個單位時間仍然從規則中原定的佇列輸出資料。

每個單位時間內,總是先讀入資料,再輸出資料。

在本題中,給定兩個入口輸入資料序列,輸出從出口輸出的資料序列。

輸入形式】

輸入檔案中包含多個測試資料。輸入檔案第1行為整數t,代表測試資料個數。每個測試資料為資料串串行(不超過100個字元),用逗號格開,表示每個單位時間內從兩個入口讀入的資料;資料串中,如果兩個資料都為正整數,則表示該單位時間內從兩個入口都讀入了整數;如果乙個資料為l或r,則表示該單位時間內該資料代表的佇列中沒有讀入正整數。注意,資料中可能有多餘的空格,比如逗號之後可能有乙個空格,第乙個資料串之前、最後乙個資料串之後也可能有空格。

測試資料保證最後乙個正整數輸入之前兩個佇列不會同時為空(當然,最後當兩個佇列都為空的時候,應該結束輸出了)。

【輸出形式】

對於每個測試資料,輸出從出口輸出的資料序列,每個正整數(包括最後乙個正整數)之後輸出乙個空格。

【樣例輸入】

168 79, l 34, l 45, 17 r, 23 r, 99 66

【樣例輸出】

68 79 34 45 17 66 23 99

題目採用先進先出的原則,所以第一步我們應該考慮的是用佇列結構來儲存資料。

由於輸入資料是字元和數字組成的,我們優先考慮使用字串或者字元陣列來儲存初始資料。

由於輸入資料中存在逗號,我們需要在輸入的時候要對逗號進行處理注意程式在同乙個時刻是要完成先輸入至少乙個數後再輸出乙個數的操作,所以輸入資料的時間會比輸入所花的時間長。

按照道理來說,可以先把資料儲存在左右佇列中後,在按照規則對資料進行輸出,但是不知道為什麼不對(後來猜測可能是同時進行輸出輸出的問題),所以我採用的是在完成輸入操作後立即進行輸出的操作。

我以時間t分部分析一下我程式求解的流程。我根據題目假設,t為奇數的時候該左佇列輸出,t為偶數的時候該右佇列輸出。

t=1s的時候:(左佇列存在資料,左佇列輸出資料)

輸入後:68 | 79      輸出後: | 79

輸出值:68

t=2s的時候:(右佇列存在資料,右佇列輸出資料)

輸入後: | 79 34      輸出後: | 34

輸出值:68 79

t=3s的時候:(左佇列不存在資料,右佇列輸出資料)

輸入後:| 34 45      輸出後: | 45

輸出值:68 79 34

t=4s的時候:(右佇列存在資料,右佇列輸出資料)

輸入後:17 | 45      輸出後: 17 |

輸出值:68 79 34 45

t=5s的時候:(左佇列存在資料,左佇列輸出資料)

輸入後:23 17 |      輸出後:23 |

輸出值:68 79 34 45 17

t=6s的時候:(右佇列存在資料,右佇列輸出資料)這裡個人覺得是關鍵的一步操作了

輸入後:99 23 | 66      輸出後:99 23 |

輸出值:68 79 34 45 17 66

t=7s的時候:(左佇列存在資料,左佇列輸出資料)

輸入後:99 23 |      輸出後:99 |

輸出值:68 79 34 45 17 66 23

t=8s的時候:(右佇列不存在資料,右佇列輸出資料)

輸入後:99 23 |      輸出後: |

輸出值:68 79 34 45 17 66 23 99

我先建立兩個佇列,左佇列q1和右佇列q2。以及乙個儲存初始資料的字串s,和兩個有著特殊作用的字串s_1s_2。佇列的詳細用法問問度娘。

#include

#include

queue q1;

//左佇列

queue q2;

//右佇列

string s_1;

//左佇列輸入

string s_2;

//右佇列輸入

string s;

//初始資料的儲存

對初始資料的預處理。因為初始資料中包涵了逗號這一特殊的字元,我們需要把它給去掉,才能繼續下一步操作。

for

(int i =

0; i < s.

length()

; i++

)

在這裡,我採用的是最原始的for迴圈語句,當然也可以採用string類的函式來進行操作。我把逗號替換成了空格,至於為什麼是空格,跟我下一步要用的函式有關。

字元流sstream,有關詳細的用法請問度娘

stringstream ss;

ss.str(s)

;getline

(cin, s)

;for

(int i =

0; i < s.

length()

; i++

)...

....

if(ss)

}

「stringstream「」能將字串進行分割,並像「cin」一樣挨著把值賦值給另外乙個變數,直到資料尾。這裡為什麼有乙個 「getline(cin, s)「」,其實我也解釋不太清楚,只是知道如果在我的程式中如果不加入這個需要兩個回車才能完成資料的輸入。

接下來就是同時進行輸入和輸出的操作了。這裡每個的編寫**的想法可能都不一樣,就不在詳細的解釋了。我自己為了更好的除錯程式,所以加了很多的沒必要的限制條件,本身的**並沒有進行優化。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

int main()

ss.str("")

; ss.

str(s)

; int t =1;

//作為判斷該左佇列輸出,還是右佇列輸出的條件

int t_time =1;

while

(t_time--)}

//輸出

if(t ==1)

}else

}else

if(t ==2)

}else}}

cout << endl;

}return0;

}

單位時間內兩個入口要麼同時讀入乙個正整數,要麼只有乙個入口讀入乙個正整數。

按照題目這個條件來說,當兩個隊列為空便可以退出迴圈條件了。但是按照我所想的同一時刻,先輸入後輸出的流程,就會出現還沒有將全部資料輸入完成,就可能出現隊列為空的情況(每次只輸入乙個資料,並且輸出資料,佇列一直是空佇列)。在這裡我用的time這個變數進行計數,即輸入資料多少次,便需要迴圈多少次。

資料結構 特殊矩陣

在乙個n階方陣a中,若元素滿足下述性質 則稱a為對稱矩陣。1 只要儲存矩陣中上三角或下三角中的元素,讓每兩個對稱的元素共享乙個儲存空間,這樣,能節約近一半的儲存空間 2 元素的個數為 n n 上三角矩陣 矩陣下三角部分 不包括對角線 元素全為c c可以為0 的矩陣 下三角矩陣 矩陣上三角部分 不包括...

資料結構 壓縮特殊矩陣

矩陣是一種常用的數學物件,一般情況下,小的矩陣我們可以直接用二維陣列直觀方便地儲存,但是在科學與工程計算問題中常會遇到較高階數的矩陣,並且矩陣中會出現大量零元素,或者矩陣中的元素呈某種規律分布。如果在這種情況下仍然採用二維陣列描述矩陣,看起來儲存密度為1,實際上卻占用了許多單元去儲存零元素或重複的非...

結構pop 特殊資料結構 單調佇列

239.滑動視窗最大值 前文講了一種特殊的資料結構 單調棧 monotonic stack,解決了一類問題 next greater number 本文寫乙個類似的資料結構 單調佇列 也許這種資料結構的名字你沒聽過,其實沒啥難的,就是乙個 佇列 只是使用了一點巧妙的方法,使得佇列中的元素單調遞增 或...