DS博客做業03--棧和隊列

1.本週學習總結

愈加深刻學習C++後,發現裏面有的容器是愈加好用,不少時候都不用本身去編寫STL中容器類型的數據,並且有的容器查找數據的話也特別快,對於不善於排序法的我可謂是很是的福利了。可是有的時候題目又比較刁鑽,你不能直接套用容器,須要特殊定製一下,又或者使用容器查找效率仍是太慢,這就須要另尋一種騷套路了。因此這一章的學習可謂是歡喜參半吧。數組

2.PTA實驗做業

2.1 題目1:jmu-報數遊戲

報數遊戲是這樣的:有n我的圍成一圈,按順序從1到n編好號。從第一我的開始報數,報到m(m<n)的人退出圈子;下一我的從1開始報數,報到m的人退出圈子。如此下去,直到留下最後一我的。其中n是初始人數;m是遊戲規定的退出位次(保證爲小於n的正整數)。要求用隊列結構完成。輸出數字間以空格分隔,但結尾不能有多餘空格。函數

輸入樣例1:學習

5 3

輸出樣例1:設計

3 1 5 2 4

輸入樣例2:3d

3 5

輸出樣例2:code

error!

2.1.1設計思路

利用for循環,循環m次,踢一我的,知道隊列裏面沒有人爲止。雖說起來很簡單,可是一開始我也沒想到能夠這麼作,能夠說也是很巧妙地利用了for循環的特色blog

2.1.2代碼截圖

2.1.3本題PTA提交列表說明


WA:看漏了題目m>n的狀況,找了很久。。。壞習慣何時能改呢排序

2.2 題目2:銀行排隊問題之單隊列多窗口服務

假設銀行有K個窗口提供服務,窗口前設一條黃線,全部顧客按到達時間在黃線後排成一條長龍。當有窗口空閒時,下一位顧客即去該窗口處理事務。當有多個窗口可選擇時,假設顧客老是選擇編號最小的窗口。
本題要求輸出前來等待服務的N位顧客的平均等待時間、最長等待時間、最後完成時間,而且統計每一個窗口服務了多少名顧客。隊列

輸入樣例:

9
0 20
1 15
1 61
2 10
10 5
10 3
30 18
31 25
31 2
3

輸出樣例:

6.2 17 61
5 3 1

2.2.1設計思路

將重心放在顧客的到達時間和窗口最先的空閒時間上面

  1. 若是窗口的最先空閒時間小於顧客到達時間說明這個窗口在顧客到達時是可用的,把顧客安排進去,而且把窗口的最先空閒時間更新爲顧客到達時間加上辦理所需時間
  2. 若是全部的窗口在顧客到達時都是不可用的,那麼就取裏面最快結束的窗口,將窗口的最快空閒時間加上顧客辦理時間,也就是說這個窗口辦理完上個顧客,就立刻來辦理當前顧客的業務
  3. 過程當中記錄等待時間數據,統計,方便最後輸出

2.2.2代碼截圖



2.2.3本題PTA提交列表說明


WA:這裏的錯誤是由於我最大等待時間初始化爲-1了。。應該初始化爲0的,不該該存在負數狀況

2.3 題目3:符號配對

請編寫程序檢查C語言源程序中下列符號是否配對://、(與)、[與]、{與}。

輸入樣例1:

void test()
{
    int i, A[10];
    for (i=0; i<10; i++) /*/
        A[i] = i;
}
.

輸出樣例1:

NO
/*-?

輸入樣例2:

void test()
{
    int i, A[10];
    for (i=0; i<10; i++) /**/
        A[i] = i;
}]
.

輸出樣例2:

NO
?-]

2.3.1設計思路

剛開始寫這道題時,腦子很沉,寫了一堆傻子同樣的代碼,不少代碼塊都是沒用的,常常忘記出棧以前要判斷棧是否爲空,如下爲修改事後的版本
這道題目我將/*與其餘字符分開考慮。

  1. 當碰見左字符時,通通直接入棧。
  2. 當碰見右字符時,首先判斷棧是否爲空,爲空就說明這個字符有問題,進入裁決函數判斷輸出結果。
    而後再判斷他前面的棧頂的符號是否和他匹配,不匹配就說明有問題,進入裁決函數輸出結果。
  3. 在整個過程當中,將/*替換成<,將*/替換成>,簡化出棧入棧

2.3.2代碼截圖



2.3.3本題PTA提交列表說明


WA1:所有判斷完後忘記了棧內仍有剩餘的狀況
WA2:在判斷/*這些類型的字符是,數組下標應該移動兩次。不然判斷 /*/ 這種的時候可能會出錯,卡了很久

2.4 題目4:銀行排隊問題之單窗口「夾塞」版

排隊「夾塞」是引發你們強烈不滿的行爲,可是這種現象時常存在。在銀行的單窗口排隊問題中,假設銀行只有1個窗口提供服務,全部顧客按到達時間排成一條長龍。當窗口空閒時,下一位顧客即去該窗口處理事務。此時若是已知第i位顧客與排在後面的第j位顧客是好朋友,而且願意替朋友辦理事務的話,那麼第i位顧客的事務處理時間就是本身的事務加朋友的事務所耗時間的總和。在這種狀況下,顧客的等待時間就可能被影響。假設全部人到達銀行時,若沒有空窗口,都會請求排在最前面的朋友幫忙(包括正在窗口接受服務的朋友);當有不止一位朋友請求某位顧客幫忙時,該顧客會根據本身朋友請求的順序來依次處理事務。試編寫程序模擬這種現象,並計算顧客的平均等待時間。

輸入樣例:

6 2
3 ANN BOB JOE
2 JIM ZOE
JIM 0 20
BOB 0 15
ANN 0 30
AMY 0 2
ZOE 1 61
JOE 3 10

輸出樣例:

JIM
ZOE
BOB
ANN
JOE
AMY
75.2

2.4.1設計思路

一開始是想利用vector類來寫這道題,由於vector能夠直接刪除指定元素,可是後來無論怎麼樣都超時了,多是使用姿式不對,因此後來又改用數組,一遍就過了
思路以下

  1. 創建map型的朋友圈,將姓名與姓名對應的鍵值存儲起來。創建flag數組,用於判斷當前客戶是否已經辦理過
  2. 而後開始讀入正式的隊列順序
  3. 判斷當前用戶是否未辦理,若是是,先將當前用戶的flag置爲1,表明已辦理。並對等待時間進行記錄。不然跳過
  4. 向後進行查找,若是碰見朋友並在當前用戶離開以前到達,就幫這位朋友辦理,記錄數據
  5. 輸出結果

2.4.2代碼截圖


2.4.3本題PTA提交列表說明

三、棧和隊列上機考試

列車調度

火車站的列車調度鐵軌的結構以下圖所示。

兩端分別是一條入口(Entrance)軌道和一條出口(Exit)軌道,它們之間有N條平行的軌道。每趟列車從入口能夠選擇任意一條軌道進入,最後從出口離開。在圖中有9趟列車,在入口處按照{8,4,2,5,3,9,1,6,7}的順序排隊等待進入。若是要求它們必須按序號遞減的順序從出口離開,則至少須要多少條平行鐵軌用於調度?

我原覺得這題很是簡單,由於我上機考試最後幾分鐘沒提交上去,可是後來復現時發現我錯了,我那時的作法根本得不到一分。

個人錯誤作法:

設計思想:至關於紙牌遊戲,取數組保存每條軌道的最後一個,由於要保證全部的軌道都是有序的,因此只有噹噹前要進入的列車temp的序號小於軌道上的最後一節車時才能進入。都不知足條件就給他一條新的軌道。
錯誤一:一開始我是用棧去實現,發現內存被限制了,開闢的stack太大了,後來就改用數組,只記錄棧頂
錯誤二:改用數組,判斷是否能插入時,應該判斷軌道中的尾車箱序號是否比要進入的小,截圖中判斷爲大。(即便這點改對了,有的點也會超時)

改進後的正確作法:

後來我發現能夠用set容器來作,並且用這個作的話巨容易,由於能夠直接找到一組元素中和要查找元素最接近的元素,也能夠刪除,並且往一個set容器插入元素是自動排序的,查找是set也會利用二分法進行查找,會比較快
設計思想:利用upper_bound(num)函數查找和num最接近的比它大的數,若是找到了,說明能夠一定能夠接在現有軌道的後面,將恰好比num大的元素找到,刪除,num代替之。沒有的話就直接插入,也就是創建一條新軌道

先貼一下set的成員

c++ stl容器set成員函數:begin()--返回指向第一個元素的迭代器

c++ stl容器set成員函數:clear()--清除全部元素

c++ stl容器set成員函數:count()--返回某個值元素的個數

c++ stl容器set成員函數:empty()--若是集合爲空,返回true

c++ stl容器set成員函數:end()--返回指向最後一個元素的迭代器

c++ stl容器set成員函數:equal_range()--返回集合中與給定值相等的上下限的兩個迭代器

c++ stl容器set成員函數:erase()--刪除集合中的元素

c++ stl容器set成員函數:find()--返回一個指向被查找到元素的迭代器

c++ stl容器set成員函數:get_allocator()--返回集合的分配器

c++ stl容器set成員函數:insert()--在集合中插入元素

c++ stl容器set成員函數:lower_bound()--返回指向大於(或等於)某值的第一個元素的迭代器

c++ stl容器set成員函數:key_comp()--返回一個用於元素間值比較的函數

c++ stl容器set成員函數:max_size()--返回集合能容納的元素的最大限值

c++ stl容器set成員函數:rbegin()--返回指向集合中最後一個元素的反向迭代器

c++ stl容器set成員函數:rend()--返回指向集合中第一個元素的反向迭代器

c++ stl容器set成員函數:size()--集合中元素的數目

c++ stl容器set成員函數:swap()--交換兩個集合變量

c++ stl容器set成員函數:upper_bound()--返回大於某個值元素的迭代器

c++ stl容器set成員函數:value_comp()--返回一個用於比較元素間的值的函數

總結:果真C++的容器是個好東西啊,這種好東西應該多瞭解一點。終究仍是太年輕

上機考試只有一題代碼題沒作出來,因此下面就把作錯過的一題貼出來好了,順便吐槽一下機房的dev,找了半天的大小寫錯誤

表達式求解

輸入一個後綴表達式,程序求出表達式值。

個人錯誤作法:

設計思想上課老師已經講了,我這裏就不復述了。
錯誤:忘記考慮負數狀況。//能夠直接看正確代碼,這張圖片沒註釋。。就是多了個判斷負數的代碼塊

改進後的正確作法:


終於寫完了。。lay了

相關文章
相關標籤/搜索