C++
序列容器 | 关联容器 | 不可排序的关联容器 |
---|---|---|
vector | set | unordered_set |
list | mulitset | unordered_multiset |
deque | map | unordered_map |
multimap | unordered_multimap |
容器适配器(Container Adapters)
std::stack
std::queue
尽管它们不是容器,但它们内部使用了容器(如 std::vector 或 std::deque)来实现其功能。用户通常不需要关心底层容器的细节,因为 stack 和 queue 提供了抽象的操作接口。
栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。
255 用队列实现栈
class MyStack {
public:
queue<int> q;
int size;
MyStack() {
size = 0;
}
void push(int x) {
q.push(x);
size++;
}
int pop() {
int result;
int tmp;
for(int i = 0; i < size - 1; i++) {
tmp = q.front();
q.pop();
q.push(tmp);
}
tmp = q.front();
q.pop();
size--;
return tmp;
}
int top() {
int ret;
ret = q.back();
return ret;
}
bool empty() {
return q.empty();
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/
20 有效的括号
class Solution {
public:
bool isValid(string s) {
stack<char> bucket;
for(int i = 0; i < s.size(); i++) {
switch(s[i]) {
case '(':
case '[':
case '{':
bucket.push(s[i]);
break;
case ')':
if(!bucket.empty() && bucket.top() == '(') {
bucket.pop();
} else {
bucket.push(s[i]);
}
break;
case ']':
if(!bucket.empty() && bucket.top() == '[') {
bucket.pop();
} else {
bucket.push(s[i]);
}
break;
case '}':
if(!bucket.empty() && bucket.top() == '{') {
bucket.pop();
} else {
bucket.push(s[i]);
}
break;
default:
break;
}
}
return bucket.empty();
}
};
1047 删除字符串中的重复字符
class Solution {
public:
string removeDuplicates(string s) {
stack<char> tmp;
for(int i = 0; i < s.size(); i++) {
if(tmp.empty() || tmp.top() != s[i]) {
tmp.push(s[i]);
} else {
tmp.pop();
}
}
string result;
while(!tmp.empty()) {
result.push_back(tmp.top());
tmp.pop();
}
reverse(result.begin(), result.end());
return result;
}
};