代码随想录算法训练营第天
栈与队列
栈与队列并不为容器,而是一种容器适配器,底层可用list、deque、vector实现(默认为deque)。
232.用栈实现队列
通过两个栈实现,一个作为输入,一个作为输出。
class MyQueue {
public:
stack<int> stIn;
stack<int> stOut;
MyQueue() {
}
void push(int x) {
stIn.push(x);
}
int pop() {
if(stOut.empty()) {
while(!stIn.empty()) {
stOut.push(stIn.top());
stIn.pop();
}
}
int result = stOut.top();
stOut.pop();
return result;
}
int peek() {
int res = this->pop();
stOut.push(res);
return res;
}
bool empty() {
return stIn.empty() && stOut.empty();
}
};
225. 用队列实现栈
用一个队列就能实现栈,弹出时,先将前面的弹出并重新加入队列。
class MyStack {
public:
queue<int> que;
MyStack() {
}
void push(int x) {
que.push(x);
}
int pop() {
int size = que.size();
for(int i = 0; i < size - 1; i++) {
que.push(que.front());
que.pop();
}
int result = que.front();
que.pop();
return result;
}
int top() {
return que.back();
}
bool empty() {
return que.empty();
}
};
20. 有效的括号
要把每种情况考虑清楚。
class Solution {
public:
bool isValid(string s) {
if(s.size() % 2 != 0) return false;
stack<char> st;
for(int i = 0; i < s.size(); i++) {
if(s[i] == '(') {
st.push(')');
}
else if(s[i] == '[') {
st.push(']');
}
else if(s[i] == '{') {
st.push('}');
}
else if(st.empty()) return false;
else if(s[i] == ')' || s[i] == ']' || s[i] == '}') {
if(st.top() == s[i]) {
st.pop();
}
else {
return false;
}
}
}
return st.empty();
}
};
1047. 删除字符串中的所有相邻重复项
匹配问题找栈。
class Solution {
public:
string removeDuplicates(string s) {
stack<char> st;
string result = "";
for(int i = 0; i < s.size(); i++) {
if(st.empty() || st.top() != s[i]) {
st.push(s[i]);
}
else {
st.pop();
}
}
while(!st.empty()) {
result += st.top();
st.pop();
}
reverse(result.begin(), result.end());
return result;
}
};