剑指 Offer 09. 用两个栈实现队列
题目描述:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
我的解法也是最笨的解法:
考虑要使用两个栈实现一个队列,栈的特点是先进后出,队列的特点是先进先出,添加队尾比较简单,直接添加到栈中就行了,最麻烦的就是怎么获取队首元素,因为往栈中添加元素的时候,前面的元素在栈底,获取队首元素时要将上面的元素全部弹出就才行。
我的解法是,应该也是很多人的解法。
- 设置两个栈input,output,input用来添加队尾元素,直接加进去就行。
- output用来获取队首元素,先将input栈中的元素逐个弹出再压入output中,这样就实现了input的元素逆序,使得output的栈顶元素变为input的栈底元素,也就是获得了队列的元素顺序。
- 然后再将output中的元素再逐个弹出压入到input中,这样input从栈底到栈顶的元素顺序就是删除了队首元素后的元素顺序。(其实根本没必要再这样做,阿巴阿巴阿巴)。
#include<stack>
#include<iostream>
using namespace std;
class CQueue {
private:
stack<int> input;
stack<int> output;
public:
CQueue() {
}
void appendTail(int value) {
input.push(value);
}
int deleteHead() {
if(input.empty()){
return -1;
}
else{
int top;
while (!input.empty())
{
output.push(input.top());
input.pop();
}
top = output.top();
output.pop();
while (!output.empty())
{
input.push(output.top());
output.pop();
}
return top;
}
}
};
/**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/
int main(){
CQueue *obj = new CQueue();
cout << obj->deleteHead();
obj->appendTail(5);
obj->appendTail(2);
cout << obj->deleteHead();
cout << obj->deleteHead();
return 0;
}
运行时间:
做完之后想想这肯定不太行,就想了半天还是看了官方解答。
其实这非常简答,就是上面第3步完全没必要,第一次删除操作时,将input栈中的元素添加到output中就实现了队尾队首分离,只要output中还有元素就可以直接获取output的栈顶元素也就是队列的队首元素,只有output为空时,再将input中元素再次按照上面第二步添加到output中又获得了新的队首元素。只有当output和input都为空时再返回-1就行了。
#include<stack>
#include<iostream>
using namespace std;
class CQueue {
private:
stack<int> input;
stack<int> output;
public:
CQueue() {
}
void appendTail(int value) {
input.push(value);
}
int deleteHead() {
if(!output.empty()){ //如果output非空就直接弹出栈顶元素就行了
int top = output.top();
output.pop();
return top;
}
if (input.empty()) {
return -1; //如果到了这一步input是空的说明output也是空,也就是队列为空
}
while (!input.empty()) //从上面的操作到这,说明output为空,input非空,将input中的元素添加到input中
{
output.push(input.top());
input.pop();
}
int top = output.top(); //然后输出队首元素
output.pop();
return top;
}
};
/**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/
int main(){
CQueue *obj = new CQueue();
cout << obj->deleteHead();
obj->appendTail(5);
obj->appendTail(2);
cout << obj->deleteHead();
cout << obj->deleteHead();
return 0;
}