【栈和队列】栈和队列的相互实现OJ练习【力扣-232、力扣-225】超详细的保姆级别解释

【栈和队列】栈和队列的相互实现OJ练习【力扣-232、力扣-225】超详细的保姆级别解释

先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种非常重要的动力 看完之后别忘记关注我哦!️️️

本篇建议收藏后食用~

这边博主提供力扣答题的传送门,大家食用完文章可以通过传送门答题:

OJ练习1:力扣225. 用队列实现栈
OJ练习2:力扣232. 用栈实现队列

还没有学习栈和队列相关内容的伙伴们,可以通过传送门食用先做了解哦:【栈和队列】纯C实现栈和队列以及其基本操作-宝藏级别数据结构教程【保姆级别详细教学】

OJ232 用栈实现队列

题目描述

在这里插入图片描述

解题思路和代码实现

我们都知道,栈是只能在一端操作的。
而与此同时,队列是一头出一头入的。

push()我们肯定没问题,直接push进去就可以了。
主要是pop()
基于这两个性质,我们用栈实现队列的时候,我们可以定义两个栈,一个用来入数据stIn,一个用来出数据stOut。这样,我们入数据时入到stIn里面,出数据的时候先将stIn里面的内容移动到stOut里面后再出即可。
即如动画所示:
gif取自百度在这里插入图片描述

有了这个思路,我们就可以轻易的写出代码了

//用栈实现队列
//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 用队列实现栈

题目描述

在这里插入图片描述

用两个队列实现栈

思路:
push()我们肯定没问题,直接push进去就可以了。
主要是pop()
这一题我们用两个队列的时候,其作用就不像上一题一样了,另外一个队列是一个临时空间而已,当我们要弹出最先进去的数字时,由于栈的性质,这个数应该在最下面,所以我们在队列里要把前面那些先临时放到一边先,然后再把最后面那个弹出去。这才是实现栈。
在这里插入图片描述

有了这个思路,我们就可以很轻易的实现栈了。

//用队列实现栈
//这个思路和上面那个是完全不一样的
//我们如果用两个队列来实现栈的话
//第二个队列是完全用来备份数据的,也就是想弹出一个数字时,前面挡住的全部
//备份,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()的问题:
这一次,我们只有一个队列,我们不备份了,前面挡住的直接重新pop()后直接放到原队列后面去,像绕圈圈一样,等真正要pop()的那个数据暴露出来后,再真正的pop()出来。
其实思路挺容易明白的

//只用一个队列的思路就是,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了,虽然它们难度不高,但是做为经典题,它的思路是值得我们学习的。
在走之前,如果感觉这篇博客对你有帮助的话,别忘了收藏点赞关注我哦!

posted @ 2022-02-24 12:38  背包Yu  阅读(6)  评论(0编辑  收藏  举报  来源