题目描述
知识点
栈,队列,设计
我的实现
码前思考
- 数据结构模拟题
代码实现
//使用两个栈来实现队列
//入队列就是入栈,出队列就是转移栈,然后弹出最上面那个
class CQueue {
public:
stack<int> pushSt;
stack<int> popSt;
CQueue() {
}
void appendTail(int value) {
pushSt.push(value);
}
int deleteHead() {
int val = -1;
if(!popSt.empty()){
val = popSt.top();
popSt.pop();
}else if(!pushSt.empty()){
while(!pushSt.empty()){
int tmp = pushSt.top();
pushSt.pop();
popSt.push(tmp);
}
val = popSt.top();
popSt.pop();
}
return val;
}
};
/**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/
时空复杂度分析
- 时间复杂度分析:由于每个元素都只经历了两次入栈和两次出栈,因此对于每个元素而言,时间复杂度为 O ( 1 ) O(1) O(1)
- 空间复杂度分析:很显然,空间复杂度为
O
(
N
)
O(N)
O(N)
码后反思
我第一次写的solution非常的繁琐,在出栈那里没有思考完整,多了很多冗余操作:
//使用两个栈来实现队列
//入队列就是入栈,出队列就是转移栈,然后弹出最上面那个
class CQueue {
public:
stack<int> pushSt;
stack<int> popSt;
CQueue() {
}
void appendTail(int value) {
pushSt.push(value);
}
int deleteHead() {
if(pushSt.empty()){
return -1;
}else{
while(!pushSt.empty()){
int tmp = pushSt.top();
pushSt.pop();
popSt.push(tmp);
}
int val = popSt.top();
popSt.pop();
while(!popSt.empty()){
int tmp = popSt.top();
popSt.pop();
pushSt.push(tmp);
}
return val;
}
}
};
/**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/