栈和队列理论基础
- C++中stack 是容器么?不是容器,是容器适配器。
- 我们使用的stack是属于哪个版本的STL?SGI STL。
- 我们使用的STL中stack是如何实现的?默认情况是deque(双向队列),也可以手动指定为vector或者list。
- stack 提供迭代器来遍历stack空间么?不提供。232.用栈实现队列
232.用栈实现队列
1.为什么MyQueue()是空的?
2.可以用!表示非
3.不要写成this->push(result);
225. 用队列实现栈
1. 栈和队列提供.size()方法
2.这一块代码不要忘了,获取top元素之后要把队列恢复原状
20. 有效的括号
我的代码:
class Solution {
public:
bool isValid(string s) {
stack<char> stk;
for(int i=0; i < s.size(); i++){
if(s[i] == '(' || s[i] == '[' || s[i] == '{'){
stk.push(s[i]);
}
else{
if(s[i] == ')'){
if(!stk.empty() && stk.top() == '('){
stk.pop();
}
else{
return false;
}
}
if(s[i] == ']'){
if(!stk.empty() && stk.top() == '['){
stk.pop();
}
else{
return false;
}
}
if(s[i] == '}'){
if(!stk.empty() && stk.top() == '{'){
stk.pop();
}
else{
return false;
}
}
}
}
//栈不为空,也匹配失败
if(stk.empty()){
return true;
}
else{
return false;
}
}
};
写的太冗余,优化一下:遇到左括号,不入栈左括号,而是入栈右括号,这样在出栈匹配的时候就可以用统一的相等语句判断,而不需要一一判断。
class Solution {
public:
bool isValid(string s) {
stack<char> stk;
for(int i=0; i < s.size(); i++){
if(s[i] == '('){
stk.push(')');
}
else if(s[i] == '['){
stk.push(']');
}
else if(s[i] == '{'){
stk.push('}');
}
else{//是右括号
if(!stk.empty() && stk.top() == s[i]){
stk.pop();
}
else{
return false;
}
}
}
//栈不为空,也匹配失败
return stk.empty();
}
};
1047. 删除字符串中的所有相邻重复项
class Solution {
public:
string removeDuplicates(string s) {
stack<char> stk;
for(int i=0; i < s.size(); i++){
if(stk.empty() || s[i] != stk.top()){
stk.push(s[i]);
}
else{
stk.pop();
}
}
int size = stk.size();
int i = size - 1;
while(!stk.empty()){
char topElem = stk.top();
stk.pop();
s[i--] = topElem;
}
s.resize(size);
return s;
}
};