代码随想录算法训练营第十天|理论基础、232.用栈实现队列、225. 用队列实现栈

本文详细解释了栈与队列在C++STL中的概念,强调它们作为containeradapter的角色,以及如何使用vector和list等底层容器实现。同时介绍了用栈模拟队列和用队列模拟栈的示例代码及其应用场景。
摘要由CSDN通过智能技术生成

题目:理论基础

文章链接:代码随想录

详解:

栈与队列提供push和pop等等接口,栈元素必须符合先进后出规则,队列元素必须符合先进先出规则,不提供走访功能,也不提供迭代器(iterrator),不像set或者map提供迭代器iterator来遍历所有元素。

栈与队列是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈与队列的功能),可以是vector,deque(双向队列),list,常使用的SGI STL,如果没有指定底层实现的话,默认是以deque为缺省情况下栈的底层结构

指定vector为栈的底层实现,初始化语句如下:

std::stack<int, std::vector<int> > third;  // 使用vector为底层容器的栈

同理,指定list 为起底层实现,初始化queue的语句如下:

std::queue<int, std::list<int>> third; // 定义以list为底层容器的队列

所以STL栈与队列不被归类为容器,而被归类为container adapter( 容器适配器)。

题目:232.用栈实现队列

文章链接:代码随想录

视频链接:LeetCode:232.用栈实现队列

题目链接:力扣题目链接

图释:

// 用栈实现队列
class MyQueue {
public:
	stack<int>stIn;    // 一个输入栈
	stack<int>stOut;   // 一个输出栈
	//想法:在push数据的时候,只要数据放进输入栈就好,但在pop的时候,
	//如果输出栈为空,则把输入栈中的元素全部导入输出栈中,再从输出栈中弹出数据
	//如果输出栈不为空,则直接从输出栈中弹出数据
	// 判断队列是否为空?如果输入栈与输出栈都为空,则说明队列为空,反之则不为空
	MyQueue() {

	}

	void push(int x) {
		stIn.push(x);
	}

	int pop() {
		int temp = peek(); //一定是从输出栈中弹出的
		stOut.pop();
		return temp;
	}

	int peek() {
		if (stOut.empty()) {
			// 输出栈为空
			while (stIn.empty() != true) {
				// 全部导入
				stOut.push(stIn.top());
				stIn.pop(); //弹出
			}
		}
		//输出栈不为空
		return stOut.top();
		
	}

	bool empty() {
		return (stIn.empty() && stOut.empty());
	}
};

题目:225. 用队列实现栈

文章链接:代码随想录

视频链接:LeetCode:225.用队列实现栈

题目链接:力扣题目链接

图释:

// 用队列实现栈
class MyStack {
public:
	queue<int>que;

	MyStack() {

	}

	void push(int x) {
		// 输入的时候,直接输入
		que.push(x);
	}

	int pop() {
		// 将前面的元素重新按顺序放入队列中
		int size = que.size();
		size--; // 确保下面的循环只留一个元素
		while (size--) {
			que.push(que.front()); //头出来一个,放到尾部
			que.pop(); // 还要弹出
		}
		int result = que.front();
		que.pop();
		return result;
	}

	int top() {
		return que.back(); //返回后尾元素
	}

	bool empty() {
		return que.empty();
	}
};

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值