利用两个栈模拟队列
class MyQueue {
private:
stack<int> a, b;
void reversea_b() {
while (!a.empty()) {
b.push(a.top());
a.pop();
}
}
public:
MyQueue() {}
void push(int x) { a.push(x); }
int pop() {
if (b.empty()) {
reversea_b();
}
int x = b.top();
b.pop();
return x;
}
int peek() {
if (b.empty()) {
reversea_b();
}
return b.top();
}
bool empty() { return a.empty() && b.empty(); }
};
利用一个队列,入栈就是队列先入一个元素,再把其他元素弹出再重新入队列,相当于一个循环圈圈
class MyStack {
private:
queue<int> q;
public:
MyStack() {}
void push(int x) {
int size = q.size();
q.push(x);
while (size--) {
q.push(q.front());
q.pop();
}
}
int pop() {
int ret = q.front();
q.pop();
return ret;
}
int top() {
int ret = q.front();
return ret;
}
bool empty() { return q.empty(); }
};
难点在于分析出不匹配的情况有三种代码随想录 (programmercarl.com)
class Solution {
public:
bool isValid(string s) {
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() || st.top() != s[i]) return false;
else st.pop();
}
return st.empty();
}
};
class Solution {
public:
string removeDuplicates(string s) {
string ret = "";
for (char ss : s) {
if (ret.empty() || ret.back() != ss) {
ret.push_back(ss);
} else {
ret.pop_back();
}
}
return ret;
}
};