【栈和队列】栈和队列的相互实现OJ练习【力扣-232、力扣-225】超详细的保姆级别解释
先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种非常重要的动力 看完之后别忘记关注我哦!️️️
这边博主提供力扣答题的传送门,大家食用完文章可以通过传送门答题:
还没有学习栈和队列相关内容的伙伴们,可以通过传送门食用先做了解哦:【栈和队列】纯C实现栈和队列以及其基本操作-宝藏级别数据结构教程【保姆级别详细教学】
文章目录
OJ232 用栈实现队列
题目描述
解题思路和代码实现
有了这个思路,我们就可以轻易的写出代码了
//用栈实现队列
//pop():弹出队头元素
//peek():获取队头元素
//push():队尾插入元素
//empty():验空
class MyQueue {
public:
stack<int>stIn;//输入栈
stack<int>stOut;//输出栈
MyQueue() {
}
//进数据的时候直接进就可以了
void push(int x) {
stIn.push(x);
}
int pop() {
//只有当stOut为空的时候,才能从stIn中导入数据(导入stIn的全部数据)
while (!stIn.empty()) {//将IN的数据倒入OUT里面,知道stIn为空
stOut.push(stIn.top());
stIn.pop();
}
int ret = stOut.top();
stOut.pop();
return ret;
}
//获取头部元素
int peek() {
int res = this->pop();//直接使用已经有了的pop函数
stOut.push(res);
return res;
}
bool empty() {
return stIn.empty() && stOut.empty();
}
};
OJ225 用队列实现栈
题目描述
用两个队列实现栈
有了这个思路,我们就可以很轻易的实现栈了。
//用队列实现栈
//这个思路和上面那个是完全不一样的
//我们如果用两个队列来实现栈的话
//第二个队列是完全用来备份数据的,也就是想弹出一个数字时,前面挡住的全部
//备份,pop完再放回去
class MyStack1 {
public:
queue<int> que1;
queue<int> que2;//pop时备份数据
MyStack1() {
}
void push(int x) {
que1.push(x);
}
int pop() {
int size = que1.size();
size--;
while (size--) {
que2.push(que1.front());//按顺序一个一个放到que2里面去
que1.pop();
}
int ret = que1.front();//留下的那个就是要弹出去的值
que1.pop();
que1 = que2;//再将que2的值直接赋给que1
while (!que2.empty()) {
que2.pop();//清空que2
}
return ret;
}
int top() {
return que1.back();//top对于栈来说是压栈那一边,所以是队列的back()
}
bool empty() {
return que1.empty();
}
};
用一个队列实现栈
//只用一个队列的思路就是,pop()的时候把前面挡住的弹出来再放到后面去跟着
//就是围一个圈圈
class MyStack {
public:
queue<int>que;
MyStack() {
}
//直接push()即可
void push(int x) {
que.push(x);
}
int pop() {
int size = que.size();
size--;//这个的作用就是留下一个真正要pop()的
while (size--) {
que.push(que.front());//一定要先压进去再pop掉,否则数据就丢了
que.pop();
}
int ret = que.front();
que.pop();
return ret;
}
int top() {
return que.back();
}
bool empty() {
return que.empty();
}
};
尾声
看到这里,相信你已经拿捏这两道经典OJ了,虽然它们难度不高,但是做为经典题,它的思路是值得我们学习的。
在走之前,如果感觉这篇博客对你有帮助的话,别忘了收藏点赞关注我哦!