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 res = stOut.top();
stOut.pop();
return res;
}
int peek() {
int res = this->pop();
stOut.push(res);
return res;
}
bool empty() {
return stIn.empty() && stOut.empty();
}
};
225. 用队列实现栈
一个队列就能实现栈
class MyStack {
public:
queue<int> st;
MyStack() {
}
void push(int x) {
st.push(x);
}
int pop() {
int size = st.size();
size--;
while (size--) {
st.push(st.front());
st.pop();
}
int res = st.front();
st.pop();
return res;
}
int top() {
int size = st.size();
size--;
while (size--) {
st.push(st.front());
st.pop();
}
int res = st.front();
st.push(st.front());
st.pop();
return res;
}
bool empty() {
return st.empty();
}
};
20. 有效的括号
用栈消除括号。
class Solution {
public:
bool isValid(string s) {
stack<char> st;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '(' || s[i] == '[' || s[i] == '{') {
st.push(s[i]);
}else {
if (st.empty()) return false;
if (s[i] == ')' && st.top() != '(') return false;
if (s[i] == ']' && st.top() != '[') return false;
if (s[i] == '}' && st.top() != '{') return false;
st.pop();
}
}
return st.empty();
}
};
1047. 删除字符串中的所有相邻重复项
消除重复项可以使用栈。此题注意出栈后元素顺序是反的,要reverse一下。
class Solution {
public:
string removeDuplicates(string s) {
stack<char> st;
for (int i = 0; i < s.size(); i++) {
if (!st.empty() && s[i] == st.top()) {
st.pop();
continue;
}
st.push(s[i]);
}
string str;
while (!st.empty()) {
str.push_back(st.top());
st.pop();
}
reverse(str.begin(), str.end());
return str;
}
};
总结
今天的内容相对比较简单。