【C++】STL(3) - 容器适配器

文章目录

  • 1. stack
    • 1.1 基本用法
    • 1.2 例子:括号匹配
  • 2. queue
    • 2.1 普通队列:queue
    • 2.2 优先队列:priority_queue
      • 2.2.1 例子:求数组中第k大的数

1. stack

1.1 基本用法

stack s1;               // 默认使用deque作为底层容器
stack> s2;  // 使用vector作为底层容器

// 入栈
s1.push(1);
s1.push(2);
s1.push(3);

// 出栈
int ret = 0;
if(!s1.empty()){
    ret = s1.top();
    s1.pop();
}

// 获取大小
cout << "size: " << s1.size() << endl;

1.2 例子:括号匹配

template bool matchBracket(const string &str, stack & s){
    clearStack(s);
    for(auto c: str){
        if(c == '(' || c == '[' || c == '{'){
            s.push(c);
        }else if(c == ')' || c == ']' || c == '}'){
            if(s.empty()){
                return false;
            }
            if((c == ')' && s.top() == '(') || (c == ']' && s.top() == '[') || (c == '}' && s.top() == '{')){
                s.pop();
            }else{
                return false;
            }
        }
    }
    return s.empty();
}

vector testCases = {
    "({[()]}",          // false
    "{[]()}[()(())]",   // true
};
stack s3;
for(auto testCase: testCases){
    cout << matchBracket(testCase, s3) << endl;
}

2. queue

2.1 普通队列:queue

queue< double > q1;
queue< double, vector > q2;

// 队尾入队
q1.push( 3.2 );
q1.push( 9.8 );
q1.push( 5.4 );

// 访问队头队尾元素
cout << q1.front() << " " << q1.back() << endl;

// 队头出队
cout << q1.frint();
q1.pop();

// 清空队列
while( !values.empty() ){
    cout << values.front() << ' ';
    values.pop();
}

2.2 优先队列:priority_queue

实现堆排序从而让队列按照优先级出队。比较器指定为less,大值元素优先级高,形成大根堆。比较器指定为greater,小值元素优先级高,形成小根堆。默认底层数据结构为vector,也可以指定为deque。

push操作:先调用底层的push_back(),再使用heapsort重新排序。

pop操作 :调用底层pop_back();top操作:调用底层的front()函数。

empty操作:调用底层的empty()函数。

#include 

template void enqueue(QT &q, DT elems){
    for(auto elem: elems){
        q.push(elem);
    }
}

priority_queue, less> pq;
vector elems = {2,4,1,6,5,8,7,9,3};
enqueue(pq, elems);

while(!pq.empty()){		// {9,8,7,6,5,4,3,2,1}
    cout << pq.top() << ' ';
    pq.pop();
}

2.2.1 例子:求数组中第k大的数

#include 
#include 
#include 
using namespace std;

template void enqueue(QT &q, DT elems){
    for(auto elem: elems){
        q.push(elem);
    }
}

template T findKthMaxElem(const vector &nums, int k){
    priority_queue, less> pq;
    enqueue(pq, nums);
    while(k > 1){
        pq.pop();
        k--;
    }
    return pq.top();
}

int main() {
    priority_queue, less> pq;
    vector elems = {2,4,1,6,5,8,7,9,3};
    int ret = findKthMaxElem(elems, 3);
    cout << ret << endl;

    return 0;
}

你可能感兴趣的:(C++,c++,开发语言)