232.用栈实现队列
思路:stin负责存入,stout负责弹出。
题解:
class Solution {
public:
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() {
if (stout.empty())
{
while (!stin.empty())
{
stout.push(stin.top());
stin.pop();
}
}
int result = stout.top();
return result;
}
bool empty() {
if (stin.empty() && stout.empty())
return true;
return false;
}
};
225. 用队列实现栈
思路:que1进行存入弹出操作,que2作为que1的备份,在que1进行弹出操作后,对它进行重新赋值。
题解:
class MyStack {
public:
queue<int> que1;
queue<int> que2;
MyStack() {
}
void push(int x) {
que1.push(x);
}
int pop() {
int size = que1.size();
while (--size)
{
que2.push(que1.front());
que1.pop();
}
int result = que1.front();
que1 = que2;
while (!que2.empty())
que2.pop();
return result;
}
int top() {
int res = this -> pop();
que1.push(res);
return res;
}
bool empty() {
return que1.empty();
}
};
20. 有效的括号
思路:遍历s,每有一个左括号,便将相应的右括号压入stack。
题解:
class Solution {
public:
bool isValid(string s) {
stack<char> st;
for (char ch : s)
{
if (ch == '(')
st.push(')');
else if (ch == '{')
st.push('}');
else if (ch == '[')
st.push(']');
else if (st.empty() || st.top() != ch)
return false;
else
st.pop();
}
return st.empty();
}
};
1047. 删除字符串中的所有相邻重复项
思路:遍历字符串s,当ch与栈顶相同时,则栈弹出元素。
题解:
class Solution {
public:
string removeDuplicates(string s) {
stack<int> st;
for (char ch : s)
{
if (!st.empty() && st.top() == ch)
st.pop();
else
st.push(ch);
}
string res;
while (!st.empty())
{
res.push_back(st.top());
st.pop();
}
reverse(res.begin(), res.end());
return res;
}
};