一、232. 用栈实现队列
class MyQueue {
private:
int size;
stack<int>stack_in;
stack<int>stack_out;
public:
//peek返回栈顶元素(窥探栈顶)
MyQueue() {
size = 0;
}
void push(int x) {
stack_in.push(x);
size++;
}
int pop() {
if(stack_out.empty() == 1){
while(stack_in.empty() != 1){
stack_out.push(stack_in.top());
stack_in.pop();
}
}
int result = stack_out.top();
stack_out.pop();
size--;
return result;
}
int peek() {
//这里可以直接使用上面的pop函数 this->pop 然后再把pop出来的push进去,返回这个数即可
if(stack_out.empty() == 1){
while(stack_in.empty() != 1){
int x = stack_in.top();
stack_in.pop();
stack_out.push(x);
}
}
int result = stack_out.top();
return result;
}
bool empty() {
//由于我加了size变量,能直接判断是否为空;
//若不使用size,则当且仅当stack_in和stack_out均为空时,队列才为空
return size == 0 ? true : false;
}
};
二、225. 用队列实现栈
其实这道题目就是用一个队列就够了。
一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。
class MyStack {
private:
queue<int>queue_empty;
queue<int>queue_full;
int size;
public:
MyStack() {
size = 0;
}
void push(int x) {
queue_full.push(x);
size++;
}
int pop() {
if(queue_full.size() != 1){
while(queue_full.size() != 1){
int x = queue_full.front();
queue_full.pop();
queue_empty.push(x);
}
}else{
int result = queue_full.front();
queue_full.pop();
size--;
return result;
}
swap(queue_full,queue_empty);//这里用swap其实不是很好,,肯定会用到额外的队列空间
//int result = queue_full.front();
// queue_full = queue_empty; // 再将que2赋值给que1
// while (!queue_empty.empty()) { // 清空que2
// queue_empty.pop();
// }
// size--;
// return result;
//换成上面的赋值会好得多,减少了空间占用
int result = queue_empty.front();
queue_empty.pop();
size--;
return result;
}
int top() {
int result = this->pop();
this->push(result);
return result;
}
bool empty() {
return 0 == size ? true : false;
}
};
三、总结
栈和队列的实现还是比较熟悉的,原理比较简单
(2小时)