1.用栈实现队列
1.1 题目
1.2 题解
class MyQueue {
public:
stack<int> in_stack;
stack<int> out_stack;
MyQueue()
{
}
void push(int x)
{
in_stack.push(x);
}
int pop()
{
//先判断出栈是否为空
if (out_stack.empty())
{
//将入栈的数据全部放入出栈
while (!in_stack.empty())
{
out_stack.push(in_stack.top());
in_stack.pop();
}
}
//弹出
int result = out_stack.top();
out_stack.pop();
return result;
}
int peek()
{
//先判断出栈是否为空
if (out_stack.empty())
{
//将入栈的数据全部放入出栈
while (!in_stack.empty())
{
out_stack.push(in_stack.top());
in_stack.pop();
}
}
//弹出
int result = out_stack.top();
return result;
}
bool empty()
{
if (in_stack.empty() && out_stack.empty())return true;
return false;
}
};
构造两个栈,一个进栈,一个出栈,当加入新数据时放入进栈,当弹出数据时,先将进栈的数据全部放入出栈,再弹出。这题主要还是考察对栈和队列的基本知识点。
2.用队列实现栈
2.1 题目
2.2 题解
class MyStack {
public:
queue<int> q;
MyStack()
{
}
void push(int x)
{
q.push(x);
}
int pop()
{
int size = q.size();
size--;
while (size--)
{
q.push(q.front());
q.pop();
}
int result = q.front();
q.pop();
return result;
}
int top()
{
return q.back();
}
bool empty()
{
return q.empty();
}
};
仅用一个队列就能实现,当要弹出元素时,将队列前面的元素加到队列的后面,然后再弹出。
3.有效的括号
3.1 题目
3.2 题解
class Solution {
public:
bool isValid(string s)
{
if (s.size() % 2 != 0)return false;
stack<int> sta;
for (int i = 0; i < s.length(); i++)
{
if (s[i] == '(')sta.push(')');
else if (s[i] == '[')sta.push(']');
else if (s[i] == '{')sta.push('}');
else if (sta.empty() || s[i] != sta.top())return false;
else sta.pop();
}
if (sta.empty())return true;
return false;
}
};
采用栈的思想,当遇到左括号就往栈里面加右括号,当遇到右括号,就看栈顶元素是否与其相等,不相等就返回fasle,相等就弹出栈顶元素。到最后如果栈为空了,说明消消乐消完了,满足条件返回true。
4.删除字符串中的所有相邻重复项
4.1 题目
4.2 题解
class Solution {
public:
string removeDuplicates(string s)
{
string result;
for (auto a : s)
{
if (!result.empty() && a == result.back())
{
result.pop_back();
}
else
{
result.push_back(a);
}
}
return result;
}
};
字符串当作栈,当字符串不为空,则当前遍历的字符和字符串尾元素比较,若相等,则从字符串中弹出,若不相等或者字符串为空,则插入遍历的字符。