学习目标:
- 232.用栈实现队列
- 225. 用队列实现栈
学习内容:
232. 用栈实现队列
class MyQueue {
public:
stack<int> stIn;
stack<int> stOut;
MyQueue() {
}
void push(int x) {
stIn.push(x);
}
int pop() {
// 从队列的开头移除并返回元素
// 只有当stOut为空的时候,再从stIn里导入数据(导入stIn全部数据)
if (stOut.empty()){
while(!stIn.empty())
{
stOut.push(stIn.top());
stIn.pop();
}
}
int value = stOut.top();
stOut.pop();
return value;
}
int peek() {
// if (stOut.empty()){
// while(!stIn.empty())
// {
// stOut.push(stIn.top());
// stIn.pop();
// }
// }
// int value = stOut.top();
// return value;
int value = this->pop(); // 直接使用已有的pop函数
stOut.push(value); // 因为pop函数弹出了元素res,所以再添加回去
return value;
}
bool empty() {
if(stIn.empty() && stOut.empty())
{
return true;
}
else
{
return false;
}
}
};
/**
* 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();
*/
错误以及注意事项
- 第一次做的时候没有考虑到stout不为空的情况,要先检查是否为空再将stInt中的数据全部导入进来。
- peek()的实现,要学会复用相似的代码比如这道题里的pop(), 要不然,对stOut判空的逻辑又要重写一遍。
225. 用队列实现栈
class MyStack {
public:
queue<int> que1;
queue<int> que2; // 辅助队列,用来备份
MyStack() {
}
void push(int x) {
// 将元素x压入栈顶
que1.push(x);
}
int pop() {
int s = que1.size();
for(int i=0;i<s-1;i++) //pop出来几次这里带不带等于拿例子试一试
{
que2.push(que1.front());
que1.pop();//塞进que2后别忘了que1中要删除呀!
}
int result;
result = que1.front();
que1.pop();
que1=que2;
while (!que2.empty()) { // 清空que2
que2.pop();
}
return result;
}
int top() {
// 返回栈顶元素
return que1.back();
}
bool empty() {
// 如果栈是空的,返回true;否则返回false;
return(que1.empty());
}
};
错误以及注意事项
- for(int i=0;i<s-1;i++) //pop出来几次这里带不带等于拿例子试一试
- que2仅仅是用来存储值的,在利用完后将值还给que1保证数据稳定。
优化
其实这道题目就是用一个队列就够了。
一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了
class MyStack {
public:
queue<int> que;
/** Initialize your data structure here. */
MyStack() {
}
/** Push element x onto stack. */
void push(int x) {
que.push(x);
}
/** Removes the element on top of the stack and returns that element. */
int pop() {
int size = que.size();
size--;
while (size--) { // 将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部
que.push(que.front());
que.pop();
}
int result = que.front(); // 此时弹出的元素顺序就是栈的顺序了
que.pop();
return result;
}
/** Get the top element. */
int top() {
return que.back();
}
/** Returns whether the stack is empty. */
bool empty() {
return que.empty();
}
};
学习时间:
2023.12.8 21:00-21:26