题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
解法
栈 A是顺序存储,用来加入队尾,栈 B 用来逆序存储,用来删除队首。具体步骤如下:
- 加入队尾push()函数: 将数字 val 加入栈 A 即可。(之前有一个不太对的想法,觉得此时如果栈 B 不为空,就要先把栈 B 的元素都转移到栈 A,再往栈 A加新元素,其实不用)
- 删除队首pop()函数: 有以下三种情况。
- 当栈 B 不为空: B中仍有已完成倒序的元素,因此直接返回 B 的栈顶元素。
- 否则,当 A 为空: 即两个栈都为空,无元素,因此返回 −1 。
- 否则: 将栈 A 元素全部转移至栈 B 中,实现元素倒序,并返回栈 B 的栈顶元素。
class CQueue {
public:
CQueue() {
}
void appendTail(int value) {
//直接存到st1
st1.push(value);
}
int deleteHead() {
//如果st2不为空,就从st2取
if( !st2.empty() ){
int value = st2.top();
st2.pop();
return value;
}
//否则就将st1的元素都转移到st2然后取。注意判断是否为空
while( !st1.empty() ){
st2.push( st1.top() );
st1.pop();
}
if( st2.empty() ) {
return -1;
}else{
int value = st2.top();
st2.pop();
return value;
}
}
private:
stack<int> st1; //顺序存放,用来加入队尾
stack<int> st2; //逆序存放,用来取出队首
};
/**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/