前言
代码随想录打卡第十天!
一、栈、队列理论基础
栈、队列在C++中被归类为容器适配器,底层由vector、deque(双端队列)、list实现。
可以通过指定改变底层实现。
std::stack<int, std::vector<int> > third; // 使用vector为底层容器的栈
std::queue<int, std::list<int>> third; // 定义以list为底层容器的队列
二、用栈实现队列
解题思路:用两个栈实现队列,一个输入栈一个输出栈,输入时直接push到输入栈即可,输出时如果输出栈为空,将输入栈的全部转移到输出栈,从输出栈栈顶进行输出即可。读取栈顶元素相同,如果输出栈为空,将输入栈全部转移到输出栈,再读取栈顶元素即可。判空条件为两个栈都为空即队列为空。
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() {
if(stackOut.empty()){
while(!stackIn.empty()){
stackOut.push(stackIn.top());
stackIn.pop();
}
}
int result = stackOut.top();
return result;
}
bool empty() {
if(stackOut.empty() && stackIn.empty()){
return true;
}else{
return false;
}
}
};
/**
* 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 {
public:
queue<int> que;
MyStack() {
}
void push(int x) {
que.push(x);
}
int pop() {
int size = que.size();
size--;
while(size--){
que.push(que.front());
que.pop();
}
int result = que.front();
que.pop();
return result;
}
int top() {
int result = this->pop();
que.push(result);
return result;
}
bool empty() {
if(que.empty()){
return true;
}else{
return false;
}
}
};
/**
* 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();
*/
总结
耗时1小时,比较简单。