北京微信網(wǎng)站建設(shè)費(fèi)用北京seo優(yōu)化公司
目錄
1.stack
1.1stack的介紹
?1.2stack的使用
練習(xí)題:
?1.3stack的模擬實(shí)現(xiàn)
2.queue的介紹和使用
2.1queue的介紹
?2.2queue的使用
2.3queue的模擬實(shí)現(xiàn)?
?3.priority_queue的介紹和使用
3.1priority_queue的介紹
?3.2priority_queue的使用
歡迎
1.stack
1.1stack的介紹
cplusplus.com/reference/stack/stack/?kw=stack
?1.2stack的使用
接口 | 說明 |
stack() | 構(gòu)造空的棧 |
empty() | 檢測stack是否為空 |
size() | 返回stack中元素的個(gè)數(shù) |
top() | 返回棧頂元素的引用 |
push() | 將元素val壓入stack中 |
pop() | 將stack中尾部的元素彈出 |
練習(xí)題:
155. 最小棧 - 力扣(LeetCode)
?
class MinStack {
public:MinStack() {}void push(int val) {_st.push(val);if(_minst.empty() || val<=_minst.top())//比較,如果小于當(dāng)前最小值,則插入_minst中_minst.push(val);}void pop() {if(_st.top() == _minst.top())//如果相等,兩個(gè)棧一起刪除該數(shù)據(jù)_minst.pop();_st.pop();}int top() {return _st.top();}int getMin() {return _minst.top();//返回最小棧的棧頂數(shù)據(jù),即最小元素}
private:stack<int> _st;stack<int> _minst;//輔助棧(最小棧):將當(dāng)前val與棧頂數(shù)據(jù)比較,將最小值入棧,即記錄當(dāng)前最小值
};
棧的壓入、彈出序列_牛客題霸_??途W(wǎng)
class Solution {
public:/*** 代碼中的類名、方法名、參數(shù)名已經(jīng)指定,請勿修改,直接返回方法規(guī)定的值即可*** @param pushV int整型vector* @param popV int整型vector* @return bool布爾型*/bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {// write code heresize_t pushi = 0, popi = 0;stack<int> st;while (pushi < popV.size()){st.push(pushV[pushi++]);//1.先入棧pushi位置的數(shù)據(jù)while (!st.empty() && popV[popi] == st.top())//棧頂數(shù)據(jù)跟popi位置序列數(shù)據(jù)比較,如果匹配則出棧,popi++//如果不匹配繼續(xù)入棧{popi++;st.pop();}}return st.empty();//如果匹配則棧為空,不匹配棧不為空}
};
150. 逆波蘭表達(dá)式求值 - 力扣(LeetCode)
#include <vector>
#include <stack>
#include <string>class Solution {
public:// 定義函數(shù) evalRPN,接收一個(gè)存儲(chǔ)字符串的向量 tokens 作為參數(shù),返回逆波蘭表達(dá)式的計(jì)算結(jié)果int evalRPN(vector<string>& tokens) {// 創(chuàng)建一個(gè)整數(shù)類型的棧 s,用于存儲(chǔ)操作數(shù)stack<int> s;// 使用范圍 for 循環(huán)遍歷 tokens 向量中的每個(gè)字符串元素,str 是對當(dāng)前元素的引用for(auto& str : tokens) {// 檢查當(dāng)前字符串是否為運(yùn)算符(+、-、*、/)if("+" == str || "-" == str || "*" == str || "/" == str) {// 若為運(yùn)算符,從棧中彈出棧頂元素作為右操作數(shù)int right = s.top();s.pop();// 再次從棧中彈出棧頂元素作為左操作數(shù)int left = s.top();s.pop();// 根據(jù)運(yùn)算符進(jìn)行相應(yīng)的運(yùn)算switch(str[0]) {// 若運(yùn)算符為 +,將左操作數(shù)和右操作數(shù)相加,結(jié)果壓入棧中case '+':s.push(left + right);break;// 若運(yùn)算符為 -,用左操作數(shù)減去右操作數(shù),結(jié)果壓入棧中case '-':s.push(left - right);break;// 若運(yùn)算符為 *,將左操作數(shù)和右操作數(shù)相乘,結(jié)果壓入棧中case '*':s.push(left * right);break;// 若運(yùn)算符為 /,用左操作數(shù)除以右操作數(shù),結(jié)果壓入棧中case '/':s.push(left / right);break;}} else {// 若當(dāng)前字符串不是運(yùn)算符,則將其轉(zhuǎn)換為整數(shù)并壓入棧中s.push(stoi(str));}}// 遍歷結(jié)束后,棧中僅剩下一個(gè)元素,即逆波蘭表達(dá)式的最終計(jì)算結(jié)果,將其返回return s.top();}
};
?1.3stack的模擬實(shí)現(xiàn)
從棧的接口中可以看出,棧實(shí)際是一種特殊的vector,因此使用vector完全可以?模擬實(shí)現(xiàn)stack
#pragma once//stack<int, vector<int>>s1;
//stack<int, list<int>>s1;
#include<vector>
#include<list>namespace pzn
{template<class T, class Container = deque<T>>class stack{public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}const T& top(){return _con.back();}size_t size() const{return _con.size();}bool empty() const{return _con.empty();}private:Container _con;};}
2.queue的介紹和使用
2.1queue的介紹
1. 隊(duì)列是一種容器適配器,專門用于在 FIFO 上下文 ( 先進(jìn)先出 ) 中操作,其中從容器一端插入元素,另一端提取元素。2. 隊(duì)列作為容器適配器實(shí)現(xiàn),容器適配器即將特定容器類封裝作為其底層容器類, queue 提供一組特定的成員函數(shù)來訪問其元素。元素從隊(duì)尾入隊(duì)列,從隊(duì)頭出隊(duì)列。3. 底層容器可以是標(biāo)準(zhǔn)容器類模板之一,也可以是其他專門設(shè)計(jì)的容器類。該底層容器應(yīng)至少支持以下操作 :empty :檢測隊(duì)列是否為空size :返回隊(duì)列中有效元素的個(gè)數(shù)front :返回隊(duì)頭元素的引用back :返回隊(duì)尾元素的引用push_back :在隊(duì)列尾部入隊(duì)列pop_front :在隊(duì)列頭部出隊(duì)列4. 標(biāo)準(zhǔn)容器類 deque 和 list 滿足了這些要求。默認(rèn)情況下,如果沒有為 queue 實(shí)例化指定容器類,則使用標(biāo)準(zhǔn)容器 dequecplusplus.com/reference/queue/queue/
?
?2.2queue的使用
接口 | 說明 |
queue() | 構(gòu)造空的隊(duì)列 |
empty() | 檢測隊(duì)列 |
size() | 返回隊(duì)列自己中有效元素的個(gè)數(shù) |
front() | 返回對頭元素的引用 |
back() | 返回隊(duì)尾元素的引用 |
push() | 在隊(duì)尾將元素val入隊(duì)列 |
pop() | 將隊(duì)頭元素出隊(duì)列 |
2.3queue的模擬實(shí)現(xiàn)?
因?yàn)?/span> queue 的接口中存在頭刪和尾插,因此使用 vector 來封裝效率太低,故可以借助 list 來模擬實(shí)
現(xiàn) queue ,具體如下:
#pragma once#include<vector>
#include<list>namespace pzn
{template<class T,class Container=deque<T>>class queue{public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_front();}const T& front() const{return _con.front();}const T& back(){return _con.back();}size_t size() const{return _con.size();}bool empty() const{return _con.empty();}private:Container _con;};
}
?3.priority_queue的介紹和使用
3.1priority_queue的介紹
cplusplus.com/reference/queue/priority_queue/
1. 優(yōu)先隊(duì)列是一種容器適配器,根據(jù)嚴(yán)格的弱排序標(biāo)準(zhǔn),它的第一個(gè)元素總是它所包含的元素中最大的。(就是堆)2. 在堆中可以隨時(shí)插入元素,并且只能檢索最大堆元素 ( 優(yōu)先隊(duì)列中位于頂部的元素) 。3. 優(yōu)先隊(duì)列被實(shí)現(xiàn)為容器適配器,容器適配器即將特定容器類封裝作為其底層容器類, queue提供一組特定的成員函數(shù)來訪問其元素。元素從特定容器的“ 尾部 ” 彈出,其稱為優(yōu)先隊(duì)列的頂部。4. 底層容器可以是任何標(biāo)準(zhǔn)容器類模板,也可以是其他特定設(shè)計(jì)的容器類。容器應(yīng)該可以通過隨機(jī)訪問迭代器訪問,并支持以下操作:empty() :檢測容器是否為空size() :返回容器中有效元素個(gè)數(shù)front() :返回容器中第一個(gè)元素的引用push_back() :在容器尾部插入元素pop_back() :刪除容器尾部元素5. 標(biāo)準(zhǔn)容器類 vector 和 deque 滿足這些需求。默認(rèn)情況下,如果沒有為特定的 priority_queue類實(shí)例化指定容器類,則使用 vector 。6. 需要支持隨機(jī)訪問迭代器,以便始終在內(nèi)部保持堆結(jié)構(gòu)。容器適配器通過在需要時(shí)自動(dòng)調(diào)用算法函數(shù)make_heap 、 push_heap 和 pop_heap 來自動(dòng)完成此操作。
?3.2priority_queue的使用
優(yōu)先級隊(duì)列默認(rèn)使用 vector 作為其底層存儲(chǔ)數(shù)據(jù)的容器,在 vector 上又使用了堆算法將 vector 中
元素構(gòu)造成堆的結(jié)構(gòu),因此 priority_queue 就是堆,所有需要用到堆的位置,都可以考慮使用
priority_queue 。注意:默認(rèn)情況下 priority_queue 是大堆 。
?
接口 | 說明 |
priority_queue() | 構(gòu)造一個(gè)空的優(yōu)先隊(duì)列 |
empty() | 檢測優(yōu)先隊(duì)列是否為空,是返回true,否則返回false |
top() | 返回優(yōu)先級隊(duì)列中最大值,即堆頂元素 |
push(x) | 在優(yōu)先級隊(duì)列中插入元素x |
pop() | 刪除優(yōu)先級隊(duì)列中最大(最小)元素,即堆頂元素 |
?【注意】
1.默認(rèn)情況下,priority_queue是大堆
#include <vector>
#include <queue>
#include <functional> // greater算法的頭文件
void TestPriorityQueue()
{
// 默認(rèn)情況下,創(chuàng)建的是大堆,其底層按照小于號比較
vector<int> v{3,2,7,6,0,4,1,9,8,5};
priority_queue<int> q1;
for (auto& e : v)
q1.push(e);
cout << q1.top() << endl;
// 如果要?jiǎng)?chuàng)建小堆,將第三個(gè)模板參數(shù)換成greater比較方式
priority_queue<int, vector<int>, greater<int>> q2(v.begin(), v.end());
cout << q2.top() << endl;
}
2.如果在priority_queue中放自定義類型的數(shù)據(jù),用戶需要在自定義類型中提供> 或者< 的重
載。
class Date
{
public:
Date(int year = 1900, int month = 1, int day = 1): _year(year)
, _month(month)
, _day(day)
{}
bool operator<(const Date& d)const
{
return (_year < d._year) ||
(_year == d._year && _month < d._month) ||
(_year == d._year && _month == d._month && _day < d._day);
}
bool operator>(const Date& d)const
{
return (_year > d._year) ||
(_year == d._year && _month > d._month) ||
(_year == d._year && _month == d._month && _day > d._day);
}
friend ostream& operator<<(ostream& _cout, const Date& d)
{
_cout << d._year << "-" << d._month << "-" << d._day;
return _cout;
}
private:
int _year;
int _month;
int _day;
};
void TestPriorityQueue()
{
// 大堆,需要用戶在自定義類型中提供<的重載
priority_queue<Date> q1;
q1.push(Date(2018, 10, 29));
q1.push(Date(2018, 10, 28));
q1.push(Date(2018, 10, 30));
cout << q1.top() << endl;
// 如果要?jiǎng)?chuàng)建小堆,需要用戶提供>的重載
priority_queue<Date, vector<Date>, greater<Date>> q2;
q2.push(Date(2018, 10, 29));
q2.push(Date(2018, 10, 28));
q2.push(Date(2018, 10, 30));
cout << q2.top() << endl;
}
練習(xí)題:
215. 數(shù)組中的第K個(gè)最大元素 - 力扣(LeetCode)
class Solution {
public:int findKthLargest(vector<int>& nums, int k) {//將數(shù)組中的元素先放入優(yōu)先級隊(duì)列中priority_queue<int> p(nums.begin(),nums.end());//將優(yōu)先級隊(duì)列中前k-1個(gè)元素刪除掉for(int i=0;i<k-1;++i){p.pop();}return p.top();}
};
?再見