總結
題目題解
棧又名堆疊,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。向乙個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從乙個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。
基本呼叫**
#include //標頭檔案
using namespace std;
stack < int > s ; //< >裡面是棧存的資料的型別,這樣就可以定義乙個叫s的存整型的棧
//常用功能
s.size() ; //返回棧的元素數
s.top() ; //返回棧頂的元素
s.pop() ; //從棧中取出並刪除元素
s.push(x); //向棧中新增元素x
s.empty(); //在棧為空時返回true
佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端進行刪除操作,而在表的後端進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。
基本呼叫**
#include //標頭檔案
using namespace std;
queue < int > q ; //< >裡面是佇列存的資料的型別,這樣就可以定義乙個叫q的存整型的佇列
//常用功能
q.size() ; //返回佇列的元素數
q.front(); //返回隊頭的元素
q.pop() ; //從佇列中取出並刪除元素
q.push(x) ;//向佇列中新增元素x
q.empty(); //在隊列為空時返回true
動態陣列是指在宣告時沒有確定陣列大小的陣列,即忽略圓括號中的下標,使用動態陣列的優點是可以根據使用者需要,有效利用儲存空間。
基本呼叫**
#include using namespace std;
vector v;
v.size (); //返回向量的元素數
v.push_ back (x) ;//在向量末尾新增元素x
v.pop_ back(); //刪除向量的最後一-個元素
v.begin(); //返回指向向量開頭的迭代器
v.end(); //返回指向向量末尾( 最後乙個元素的後乙個位置)的迭代器
常用的**
#include using namespace std;
list l;
l.size (); //返回表的元素數
l.begin(); //返回指向表開頭的迭代器
l.end() ; //返回指向表末尾(最後乙個元素的後乙個位置)的迭代器
l.push_ front (x) ; //在表的開頭新增元素x
l.push_ back (x) ;//在表的末尾新增元素x
l.pop_ front () ;//刪除位於表開頭的元素
l.pop_ back () ;//刪除位於表末尾的元素
l.insert(p, x) ;//在表的位置p處插入元素x
l.erase (p) ;//刪除表中位置p的元素
l.clear () ;//刪除表中所有元素
題目鏈結
題目描述: 在某個字串(長度不超過100)中有左括號、右括號和大小寫字母;規定(與常見的算數式子一樣)任何乙個左括號都從內到外與在它右邊且距離最近的右括號匹配。寫乙個程式,找到無法匹配的左括號和右括號,輸出原來字串,並在下一行標出不能匹配的括號。不能匹配的左括號用"$「標註,不能匹配的右括號用」?"標註.
解題思路:考慮用棧來解決這個問題,遇到左括號就把左括號壓棧,遇到右括號就檢視棧裡面是否有左括號,如果沒有,那顯然這個右括號是非法的,如果有,那就把棧頂的左括號pop出來。要注意一點就是最後要檢查棧裡面是否還有左括號,如果整個字串都遍歷完了,但是棧裡面還留有一些左括號,那麼顯然這些左括號也是非法的,所以壓棧的時候要記錄一下壓進去的左括號的位置,或者直接把位置壓進去應該也是可行的,(但是我沒這麼做qwq)。
ac**
#include #include #include #include using namespace std;
struct node n;
int main()
for(int i=0;i題目鏈結
題目描述:
給定乙個字串s和乙個整數k,你的任務是找到滿足以下條件的字典上最小的字串t:
t是s的子串行
t的長度是k。
解題思路:這裡我是用鍊錶做的,題目其實很明確,找最小字典序嘛…我的理解是,可以轉換成找區間的最小值,大概就是,前n個數中找乙個最小值,那第n個位置的最小字典序就是那個最小值(畫圖舉例腦補一下下qwq),但是有乙個問題,如果我這樣做的話,那複雜度就是o(n²),那顯然會超時,所以我用了其他方法,就是先用鍊錶把n個數存下來,然後從第乙個開始遍歷,如果乙個數比它後面那個數小的話,那就把這個數刪了, 這裡就發揮了鍊錶的優越性了,如果用陣列來存這些數,刪起來會比較麻煩。一直刪,直到n等於k為止那麼留下來的k個數就是滿足題意得最小字典序啦。
ac**
#include #include #include #include #include #include using namespace std;
int main()
if(*itn>*it)
n--;
}itn=it;
} it=l.begin();
int i=0;
for(it;ireturn 0;
}
資料結構與演算法 小白的演算法學習之路
1.1 個人感悟 這種狀態直到前段時間才有改變。幫師弟解決了乙個檔案中字串排序的問題,使用了一直早有耳聞的multimap,將乙個本來需要將近1h才能出結果的程式優化成1s不到出結果,著實在精神上感到了振奮,也認識到了資料結構和演算法的巨大威力和無窮魅力!讓我發自內心感受到身為程式設計師,無法駕馭資...
資料結構與演算法學習筆記(四)
單鏈表的整表建立宣告一結點p和計數器變數i 初始化一空鍊錶l 讓l的頭結點的指標指向null,即建立乙個帶頭結點的單鏈表 迴圈實現後繼結點的賦值和插入 頭插法 從乙個空表開始,生成新節點,讀取資料存放到新結點的資料域中,然後將新結點插入到當前鍊錶的表頭上,直到結束位置。簡單來說就是把新加進的元素放在...
演算法學習之路的心得三之動態規劃
1.總結 2.題目題解 我個人覺得動態規劃是乙個很難的演算法,主要是分支太多太多,題型千變萬化,目前,我做題的話,學過或者做過類似的題目還好說,沒做過的話,想是很難想出來的。做動態規劃的題目,最重要的還是找到狀態方程,這樣才能一步一步把答案推出來,不然沒法做。反正吧,動態規劃沒有什麼固定的知識點或者...