1. LC 232 用栈实现队列
两个栈可以实现,一个用作辅助就行。
class MyQueue {
private:
stack<int> st1;
stack<int> st2;
public:
MyQueue() {}
void push(int x) {
st1.push(x);
}
int pop() {
while(st1.size() > 1) {
st2.push(st1.top());
st1.pop();
}
int res = st1.top();
st1.pop();
while(!st2.empty()) {
st1.push(st2.top());
st2.pop();
}
return res;
}
int peek() {
while(st1.size() > 1) {
st2.push(st1.top());
st1.pop();
}
int res = st1.top();
while(!st2.empty()) {
st1.push(st2.top());
st2.pop();
}
return res;
}
bool empty() {
return st1.empty();
}
};
2. LC 225 用队列实现栈
和上一题一模一样甚至更简单
class MyStack {
private:
queue<int> q1;
queue<int> q2;
public:
MyStack() {}
void push(int x) {
q1.push(x);
}
int pop() {
int res = q1.back();
while (q1.size() > 1) {
q2.push(q1.front());
q1.pop();
}
q1.pop();
while(!q2.empty()) {
q1.push(q2.front());
q2.pop();
}
return res;
}
int top() {
return q1.back();
}
bool empty() {
return q1.empty();
}
};
3. LC 20 有效的括号
经典中的经典, 感觉比起第一次做这题,新增用例又提示了很多需要考虑的边界条件
class Solution {
public:
bool isValid(string s) {
if (s.size() % 2 == 1) return false;
stack<char> stk;
for (auto ch : s) {
if (ch == '(') stk.push(')');
else if (ch == '[') stk.push(']');
else if (ch == '{') stk.push('}');
else if (stk.empty() || stk.top() != ch) return false;
else stk.pop();
}
if (!stk.empty()) return false;
return true;
}
};
4. LC 1047 删除字符串中的所有相邻重复项
将string抽象为栈使用
class Solution {
public:
string removeDuplicates(string S) {
string ret;
for(auto c:S){
if(ret.empty()||c!=ret.back()){
ret.push_back(c);
}else{
ret.pop_back();
}
}
return ret;
}
};