一、题意
二、思路
这是一道模拟题,不涉及到具体算法,考察的是对栈和队列的掌握。
使用栈来模拟队列的行为,只用一个栈是不行的,一定需要两个栈:
- 输入栈
stack_in
- 输出栈
stack_out
stack<int> stIn;//输入栈 stack<int> stOut;//输出栈
在 push
函数的时候,只要数据放进去就好了。
/** Push element x to the back of queue. */ void push(int x) { stIn.push(x); }
在 pop
函数的时候,操作就复杂一些,输出栈如果为空,就把进栈数据全部导入进来,再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以。
/** Removes the element from in front of queue and returns that element. */ int pop() { // 只有当stOut为空的时候,再从stIn里导入数据(导入stIn全部数据) if (stOut.empty()) { // 从stIn导入数据直到stIn为空 while(!stIn.empty()) { stOut.push(stIn.top()); stIn.pop(); } } int result = stOut.top(); stOut.pop(); return result; }
最后如何判断队列为空呢?
如果进栈和出栈都为空的话,说明模拟队列为空了。
/** Returns whether the queue is empty. */ bool empty() { return stIn.empty() && stOut.empty(); }
返回队列首部元素 peek
和pop
函数的实现是相似的:
/** Get the front element. */ int peek() { int res = this->pop(); // 直接使用已有的pop函数 stOut.push(res);//上一个pop函数中已将这个元素删除;这里应该push回去,才能保证不删除; return res; }
三、完整代码
class MyQueue { public: stack<int> stIn;//输入栈 stack<int> stOut;//输出栈 /** Initialize your data structure here. */ MyQueue() { } /** Push element x to the back of queue. */ void push(int x) { stIn.push(x); } /** Removes the element from in front of queue and returns that element. */ int pop() { // 只有当stOut为空的时候,再从stIn里导入数据(导入stIn全部数据) if (stOut.empty()) { // 从stIn导入数据直到stIn为空 while(!stIn.empty()) { stOut.push(stIn.top()); stIn.pop(); } } int result = stOut.top(); stOut.pop(); return result; } /** Get the front element. */ int peek() { int res = this->pop(); // 直接使用已有的pop函数,this应该是队首 stOut.push(res); // 因为pop函数弹出了元素res,所以再添加回去 return res; } /** Returns whether the queue is empty. */ bool empty() { return stIn.empty() && stOut.empty(); } };
文章知识点与官