原题
题目大意及思路
- 思路: 题中要求使用栈来实现队列,做到可以直接删除并输出最先进去的元素,在队尾增加元素。我们可以想到从一个栈pop到另一个栈可以使得最先输入的元素位于栈的首部,所以什么时候将一个栈的元素pop到另一个栈是关键。一般来说解题应该重点考虑临界条件,此时的临界条件是栈空。而两个栈均空时,输入deleteHead则应输出-1,输入appendtail时应该将元素放至其中一个栈中;那么我们可以想到,输入元素时我们应固定在一个栈中,若一直在输入,另一个栈应为空,当需要输出最先的元素时,我们应将第一个栈的元素全倒过去放至第二个栈,进行输出。因此我们将两个栈分别作为输入栈和输出栈,所有的输入直接放入输入栈中,当需要输出时查看输出栈是否为空,若为空,将输入栈元素全部倒入输出栈,若非空,直接输出输出栈栈顶元素。
代码
class CQueue {
public:
stack<int> in_stack, out_stack;
CQueue() {
}
void appendTail(int value) {
in_stack.push(value);
return;
}
int deleteHead() {
if(out_stack.empty()){
if(in_stack.empty()) return -1;
else{
while(!in_stack.empty()){
out_stack.push(in_stack.top());
in_stack.pop();
}
}
}
int out_element=out_stack.top();
out_stack.pop();
return out_element;
}
};
/**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/
运行截图
收获
最后根据官方解答,将两个栈调整了一下:
从public到private。
因为类对象里的public都能外界调用使用,但这两个栈应该保持其私有性,防止恶意破坏。
public:
stack<int> in_stack, out_stack;
变至:
private:
stack<int> in_stack, out_stack;
public: