[代码随想录算法训练营]刷题笔记 Day 10

本文介绍了C++ STL中Stack和Queue两种数据结构的基础知识,包括它们在不同版本STL中的实现差异,特别是SGI STL中的实现方式,允许使用不同容器作为底层逻辑。此外,还讨论了如何利用两个栈实现队列,以及如何用一个队列模拟栈的操作,详细展示了这两个数据结构在实际问题解决中的灵活性和实用性。
摘要由CSDN通过智能技术生成

Stack与Queue基本知识复习

首先Stack和Queue是STL(C++标准库)里面的两个数据结构,但是不同版本的STL里面,他们的实现方法不同。

  1. HP STL 其他版本的C++ STL,一般是以HP STL为蓝本实现出来的,HP STL是C++
    STL的第一个实现版本,而且开放源代码。

  2. P.J.Plauger STL 由P.J.Plauger参照HP STL实现出来的,被Visual C++编译器所采用,不是开源的。

  3. SGI STL 由Silicon Graphics Computer Systems公司参照HP STL实现,被Linux的C++编译器GCC所采用,SGI STL是开源软件,源码可读性甚高。

接下来总结的是SGI STL,Stack跟Queue是以底层容器完成其所有的工作,对外提供统一的接口(不提供iterator来遍历),底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。

所以是Container Adapter,底层实现则是用vector,deque(默认),list。通过以下指令在宣告时可以指定底层逻辑

std::stack<int, std::vector<int> > third;
std::queue<int, std::list<int>> third; 

在这里插入图片描述

232.用栈实现队列

使用两个栈来实现队列的话,我们可以一个用来专门输入,一个专门用来输出。将资料放置输出的时后就是使用者调用pop函数时。

class MyQueue {
public:
	stack<int> dataIn;
	stack<int> dataOut;
    MyQueue() { }
    
    void push(int x) {
		dataIn.push(x);
    }
    
    int pop() {
    	// 如果dataOut空了就将dataIn的资料全部取出来,然后放进dataOut里面
		if(dataOut.empty()){
			while(!dataIn.empty()){
				auto tempData = dataIn.top();
				dataIn.pop();
				dataOut.push(tempData);
			}
		}
    	auto result = dataOut.top();
    	dataOut.pop();
    	
    	return result;
    }
    
    int peek() {
    	// 调用自身的pop函数,再将资料放回dataOut;
    	auto result = this->pop();
    	dataOut.push(result);
    	return result;
    }
    
    bool empty() {
		return dataIn.empty() && dataOut.empty();
    }
};

225. 用队列实现栈

运用前一题的思想,将资料提出来又放回去,直到拿到顶层资料。

class MyStack {
public:
	queue<int> data;
    MyStack() { }
    
    void push(int x) {
		data.push(x);
    }
    
    int pop() {
		auto operation = data.size() - 1;
    	while(operation--){
    		data.push(data.front());
    		data.pop();
    	}
    	auto result = data.front();
    	data.pop();
    	return result;
    }
    
    int top() {
		auto result = this->pop();
    	data.push(result);
    	return result;
    }
    
    bool empty() {
		return data.empty();
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值