1.基础理论知识
1.1栈
先进后出(a)
a.push()-------放元素
a.empty()--------判断是否为空
a.pop()-------删除最后进去的元素
a.top()-------返回最后进去的那个元素
只开一边,只能返回一边
1.2队列
先进先出(a)
a.push()-------放元素
e.empty()-------判断是否为空
a.pop()------删除第一个进去的素
a.front()----返回第一次加进去的元素
a.back()-----返回最后一次加进去的元素
两边都开了,所以可以返回两边
1.3deque---双端队列
队列和vector的结合
a.front()-----返回第一个
a.back()-----返回最后一盒
a.push_back()--------加到最后
a.pop_back()-------删除最后一个
a.pop_front()-------删除第一个
1.4优先级队列--priotity_queue
1.priority_queue<pair<int, int>, vector<pair<int, int>>, compare>pri_que;----定义
第一个参数是第二个参数的类型,第二个参数是队列类型,第三个是比较函数,所以我们要写一个比较函数
2.
-
bool operator()(const pair<int, int>& b, const pair<int, int>& a) {
-
return b.second > a.second;
-
}--------比较函数
两个参数比较
3.其他都与queue相同(push.pop),但是只能返回一端,只能用top返回第一个元素
2.题目链接:232. 用栈实现队列
c++代码
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() {
int res = this->pop();
stOut.push(res);
return res;
}
//两个栈都为空队列才为空
bool empty() {
return stIn.empty() && stOut.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();
*/
2.1思路
用两个栈来实现一个队列,数据先进第一个栈,再进第二个栈,拿出来的就是队列中的第一个元素了,通过两个栈来改变方向,倒置元素
3.题目链接:225. 用队列实现栈
可以像上一个用两个数据结构,但是下面我们试试一个队列来做
c++代码
class MyStack {
public:
queue<int>que;
MyStack() {
}
//加元素
void push(int x) {
que.push(x);
}
//删除元素
//把前面size-1个元素放到队列后面了,就可以找到相当于栈的第一个元素了,返回它,再删除它
int pop() {
int s = que.size();
s--;
while (s--) {
int res = que.front();
que.pop();
que.push(res);
}
int res = que.front();
que.pop();
return res;
}
//返回第一个元素,相当于返回队列最后一个元素
int top() {
return que.back();
}
bool empty() {
return que.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();
*/
3.1思路
删除栈的第一个元素,就表示需要删除队列的最后一个元素,所以我们先把前size-1个元素移除,再pop()就删除了,再把移除的元素加到队列中,就相当于在队列中移除了最后个元素