今天学习的内容是栈和队列相关的内容
首先学习栈和队列的基本知识。队列先进先出,栈先进后出。
栈和队列在标准库中,不属于容器,而是容器适配器,他的底层容器是可以替换的,可以是数组,也可以是链表等。
默认条件下,栈是以deque为缺省状态下的底层实现。
也可以初始化使用vector作为底层实现
std::stack<int, std::vector<int> > third; // 使用vector为底层容器的栈
队列在默认条件下也是以deque实现,也可以用list实现
std::queue<int, std::list<int>> third; // 定义以list为底层容器的队列
进一步了解栈和队列,练习了下面两道题目
1. 用栈实现队列
这道题目是对栈基本操作的使用。栈先进后出,如果创建一个顺序相反的栈,就可以做到先进先出,利用两个栈就可以模拟队列的作用。
class MyQueue {
public:
stack<int> stackIn;
stack<int> stackOut;
MyQueue() {
}
void push(int x) {
stackIn.push(x);
}
int pop() {
if(stackOut.empty()){
while(!stackIn.empty()){
stackOut.push(stackIn.top());
stackIn.pop();
}
}
int result=stackOut.top();
stackOut.pop();
return result;
}
int peek() {
int res= this->pop();
stackOut.push(res);
return res;
}
bool empty() {
if(stackIn.empty()&&stackOut.empty())return true;
else return false;
}
};
2. 用队列实现栈
队列先进先出,即使放入另一个队列也是先进先出,这样上一题的思路就不成立了。
用两个队列来实现栈,一个队列存储除了最后一个元素之外的元素,然后队列再将最后一个元素弹出,再把元素送回队列。
以上的操作也可以用一个队列实现,把队列中前面的元素弹出后插入队尾,再把最后一个元素弹出。代码实现如下:
class MyStack {
public:
queue<int> stack;
MyStack() {
}
void push(int x) {
stack.push(x);
}
int pop() {
int size=stack.size()-1;
if(!stack.empty()){
while(size--){
stack.push(stack.front());
stack.pop();
}
}
int result=stack.front();
stack.pop();
return result;
}
int top() {
int res=this->pop();
stack.push(res);
return res;
}
bool empty() {
if(stack.empty()) return true;
return false;
}
};
求top这里,可以直接利用队列双侧打开的特点,直接求back的值
int top() {
return que1.back();
}