使用两个栈来实现队列,其中一个栈用来入,一个栈用来出,当要插入或者删除数据的时候,将数据从一个栈导入到要操作的栈即可。‘
class MyQueue {
private:
stack s1;
stack s2;
public:
MyQueue() {
}
void exchange(stack& s1,stack& s2)
{
int temp;
while(!s1.empty())
{
temp=s1.top();
s1.pop();
s2.push(temp);
}
}
void push(int x) {
exchange(s2,s1);
s1.push(x);
}
int pop() {
exchange(s1,s2);
int temp=s2.top();
s2.pop();
return temp;
}
int peek() {
exchange(s1,s2);
return s2.top();
}
bool empty() {
return s1.empty()&&s2.empty();
}
};
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue* obj = new MyQueue();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->peek();
* bool param_4 = obj->empty();
*/
使用一个队列就可以实现栈,当入栈的时候再队尾插入,出栈的时候依次将队首的元素移动到队尾,当找到最后一个元素的时候将它出栈。
class MyStack {
private:
queue q;
public:
MyStack() {
}
void push(int x) {
q.push(x);
}
int pop() {
int size=q.size()-1;
while(size--)
{
int tmp=q.front();
q.pop();
q.push(tmp);
}
int tmp=q.front();
q.pop();
return tmp;
}
int top() {
return q.back();
}
bool empty() {
return q.empty();
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
遍历整个数组,如果遇到左括号,则将括号入栈,如果遇到右括号,看栈顶元素是不是该右括号,是则出栈,不是则退出。
class Solution {
public:
bool isValid(string s) {
stack S;
for(int i=0;i 给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
用栈来操作,遍历整个数组,判断和栈顶元素是否相同,如果相同则出栈,不同则入栈。
class Solution {
public:
string removeDuplicates(string s) {
stack S;
for(int i=0;i 150. 逆波兰表达式求值根据 逆波兰表示法,求表达式的值。
有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
注意 两个整数之间的除法只保留整数部分。
可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
遇到数字入栈,遇到符号则将符号前两个数计算并出栈,将结果进行入栈。
class Solution {
public:
int evalRPN(vector& tokens) {
stack S;
for(int i=0;i 使用的是一个单调队列。

使用deque这个数据结构建立单调队列。
对于单调队列,当插入的数据比它前一个数据大的时候,将前一个数据从队列后出队列,然后再向前依次比较,最终将该数据插入。这样就保证了队列首元素始终都是最大的元素。
当要主动出队列的时候,只有一种情况,那就是队列满了,此时我们知道要出队列的是哪个元素,因此我们判断队列首是哪个元素,如果是要出队列的,直接出队列即可。
class Myqueue
{
private:
deque q;
public:
void pop(int val)
{
if(!q.empty()&&val==q.front())
{
q.pop_front();
}
}
void push(int val)
{
while(!q.empty()&&val>q.back())
{
q.pop_back();
}
q.push_back(val);
}
int Getfront()
{
return q.front();
}
};
class Solution {
public:
vector maxSlidingWindow(vector& nums, int k) {
vector result;
Myqueue q;
for(int i=0;i 使用堆和map配合,map用于统计元素个数,堆用来求TopK问题。
注意这里的堆操作。
class Solution {
public:
class Compare
{
public:
bool operator()(const pair&lhs,const pair& rhs)
{
return lhs.second>rhs.second;
}
};
vector topKFrequent(vector& nums, int k) {
unordered_map m;
for(auto& e:nums)
{
m[e]++;
}
priority_queue,vector>,Compare> heap;//建立一个小顶堆
for(auto& e:m)
{
if(heap.size()heap.top().second)
{
heap.pop();
heap.push(e);
}
}
vector result;
while(!heap.empty())
{
result.push_back(heap.top().first);
heap.pop();
}
return result;
}
};
{
heap.push(e);
}
else if(e.second>heap.top().second)
{
heap.pop();
heap.push(e);
}
}
vector result;
while(!heap.empty())
{
result.push_back(heap.top().first);
heap.pop();
}
return result;
}
};