目录
一、232.用栈实现队列
1.题目描述
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push
、pop
、peek
、empty
):
实现 MyQueue
类:
void push(int x)
将元素 x 推到队列的末尾int pop()
从队列的开头移除并返回元素int peek()
返回队列开头的元素boolean empty()
如果队列为空,返回true
;否则,返回false
说明:
- 你 只能 使用标准的栈操作 —— 也就是只有
push to top
,peek/pop from top
,size
, 和is empty
操作是合法的。 - 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
- 假设所有操作都是有效的 (例如,一个空的队列不会调用
pop
或者peek
操作)
2.解题思路
用两个栈来实现队列的相关功能。定义一个输入栈和一个输出栈。
push函数:将元素存放到输入栈即可。
empty函数:如果输入栈和输出栈都为空,则为空。
pop函数:这里要注意,一定先检查输出栈里还有没有元素,如果没有元素,就将输入栈中的所有元素都导入到输出栈中。然后对输出栈pop()即可。
peek函数:和pop函数类似,因为在同一个类中,直接复用即可。这里要注意,因为pop函数直接弹出了,所以还要将弹出的结果再存放进去。
3.代码实现
class MyQueue {
public:
MyQueue() {
}
stack<int> stIn;//输入栈
stack<int> stOut;//输出栈
void push(int x) {
stIn.push(x);//入队 只要将元素加入输入栈即可
}
int pop() {//出队 !!!!一定先检查输出栈是否为空!!!!
int result;//result用来存放出队列元素的value
//只有输出栈为空,再从输入栈里导入数据(导入全部数据)
if(stOut.empty()){
while(!stIn.empty()){//将输入栈的元素全部推到输出栈里
stOut.push(stIn.top());//获取输入栈的栈顶元素
stIn.pop();//将栈顶元素出栈
}
}
result = stOut.top();
stOut.pop();
return result;
}
int peek() {//和pop类似,直接复用
int result = this->pop();
stOut.push(result);//这里只要求查看队头元素,而上面复用的pop函数弹出了result,所以再push进去
return result;
}
bool empty() {
return stIn.empty() && stOut.empty();//只要输入栈和输出栈是空,那么队列就是空
}
};
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue* obj = new MyQueue();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->peek();
* bool param_4 = obj->empty();
*/
二、225. 用队列实现栈
1.题目描述
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push
、top
、pop
和 empty
)。
实现 MyStack
类:
void push(int x)
将元素 x 压入栈顶。int pop()
移除并返回栈顶元素。int top()
返回栈顶元素。boolean empty()
如果栈是空的,返回true
;否则,返回false
。
注意:
- 你只能使用队列的基本操作 —— 也就是
push to back
、peek/pop from front
、size
和is empty
这些操作。 - 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
2.解题思路
定义两个队列,que1和que2,que2用作辅助队列,用来保存que1除最后一个元素以外的元素,等que1将最后一个元素弹出之后,再将数据导回。
3.代码实现
class MyStack {
public:
queue<int> que1;
queue<int> que2;
//que2为辅助队列,将que1最后一个元素以外的元素备份,等que1弹出最后一个元素,再把que2导回que1
MyStack() {
}
void push(int x) {
que1.push(x);
}
int pop() {
//将que1最后一个元素以外的元素先移走,出后对que1pop
int size = que1.size();
size--;
while(size--){//备份导que2中
que2.push(que1.front());
que1.pop();
}
int result;
result = que1.front();
que1.pop();
//开始将辅助队列的元素导回que1
que1 = que2;
//清空que2
while(!que2.empty()){
que2.pop();
}
return result;
}
int top() {
return que1.back();
}
bool empty() {
return que1.empty();
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/