C++stack

目录

1.什么是stack

2.容器适配器

3.stack的使用

top

push

 pop

 

4.模拟实现stack


1.什么是stack

1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行 元素的插入与提取操作。(后进先出)
2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定 的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。
3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下
操作:
empty:判空操作
back:获取尾部元素操作
push_back:尾部插入元素操作
pop_back:尾部删除元素操作
4. 标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器, 默认情况下使用deque。

2.容器适配器

容器适配器(Container Adapters)是 C++ 标准库提供的一种数据结构,它们基于现有的容器类型,提供了特定的接口和功能,以便更方便地实现某些特定的数据结构和算法。容器适配器本质上是对底层容器的封装,提供了不同的数据访问方式,使它们适用于特定的用途。 

标准库中提供了三种常用的容器适配器:

stack:栈适配器,基于底层容器提供了栈数据结构的操作,如压入(push)、弹出(pop)、查看栈顶元素等。默认底层容器是 deque,但也可以使用其他支持 back() 和 push_back() 操作的容器。


queue:队列适配器,基于底层容器提供了队列数据结构的操作,如入队(push)、出队(pop)、查看队首元素等。默认底层容器是 deque,但也可以使用其他支持 back() 和 push_back() 操作的容器。


priority_queue:优先队列适配器,基于底层容器提供了优先队列数据结构的操作,支持在插入元素时根据优先级进行排序。默认底层容器是 vector,但也可以使用其他支持随机访问和插入操作的容器。

3.stack的使用

这些是C++标准库中stack类的构造函数声明。stack是一个适配器容器,它可以使用不同的底层容器来实现栈的功能。这些构造函数声明提供了不同的方式来创建和初始化stack对象,可以根据需求选择合适的构造函数。 

stack的Construct中除了构造函数,其他什么都没有,它连拷贝构造、析构都没有。这个也跟它是容器适配器有关系,因为它的成员都是自定义类型,编译器默认生成的就够用。

stack是容器适配器以后,就开始不支持迭代器了。容器支持迭代器,容器适配器不支持迭代器。

栈随便去遍历反而是不好的,因为要保证后进先出的性质。

所以取数据得用top,想取下一个数据就得先pop。

top

reference top(); 和 const_reference top() const; 是 C++ 标准库中 std::stack 类的成员函数之一。它们用于获取栈顶元素的引用。

reference top();:返回栈顶元素的引用。如果需要修改栈顶元素,可以使用这个版本。

#include <iostream>
#include <stack>

		stack<int> m;

		m.push(42);
		m.push(15);

		// 使用 top() 获取栈顶元素
		int topElement = m.top();
		cout << "Top element: " << topElement << endl;

		// 修改栈顶元素
		m.top() = 99;
		cout << "New top element: " << m.top() << endl;

		return 0;
	

}

 

后进先出,15先出,然后修改为99,最后出99

push

是 C++ 标准库中 std::stack 类的成员函数之一。它们用于将一个新的元素压入栈中。

这两个版本的 push 函数允许你在栈顶添加新的元素。如果需要保持传入值的不变性,可以使用第一个版本;如果你想利用移动语义来避免不必要的复制,可以使用第二个版本。
#include<iostream>
#include<stack>
using namespace std;


	int main() 
	{
		stack<int> m;

		m.push(10); // 使用右值,将 10 压入栈中
		m.push(19);

		int newElement = 99;
		m.push(newElement); // 使用常量引用,将 newElement 压入栈中

		cout << "Stack size: " << m.size() << endl;

		while (!m.empty())  // 遍历不能用迭代器,容器适配器不支持迭代器
		{
			cout << m.top() << " "; // 输出栈顶元素
			m.pop(); // 弹出栈顶元素
		}

		return 0;
	}

 pop

void pop(); 是 C++ 标准库中 stack 类的成员函数之一。它用于将栈顶元素弹出(删除)。

这个函数没有返回值,它只是从栈中移除栈顶元素。在调用 pop() 函数之前,需要确保栈不为空,否则会导致未定义行为。

	int main() 
	{
		stack<int> m;

		m.push(10); // 使用右值,将 10 压入栈中
		m.push(19);
		m.push(29);

		cout << "Stack size: " << m.size() << endl;

		m.pop();

		cout << "Stack new size: " << m.size() << endl;

		return 0;
	}

4.模拟实现stack

STL(标准模板库)中的 stack 和 queue 默认使用 std::deque 作为底层容器的原因是出于性能和功能的考虑。

std::deque(双端队列)是一个双向开口的动态数组,支持在队首和队尾进行高效的插入和删除操作。它的内部实现使得在队首和队尾的操作都能达到接近常数时间复杂度,这使得 std::deque 在作为底层容器时能够提供较好的性能
 

实现代码

#pragma once

#include "string.h"
#include<iostream>
#include<stack>
#include<deque>


using namespace std;


namespace lty
{
	//适配器模式
	template<class T, class Container=deque<T>>
	class stack
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}

		void pop()
		{
			_con.pop_back();
		}

		const T& top()
		{
			return _con.back();
		}

		size_t size()
		{
			return _con.size();
		}

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

	private:
		Container _con;
	};

	void test_stack()
	{
		stack<int, deque<int>> st;
		st.push(1);
		st.push(2);
		st.push(3);
		st.push(4);

		while (!st.empty())
		{
			cout << st.top() << " ";
			st.pop();
		}
		cout << endl;
	}
}

测试代码

#include "string.h"


int main()
{
	lty:: test_stack();
}

结果

头文件包含:代码首先包含了头文件 <deque>,这是为了使用底层容器 std::deque。

命名空间定义:代码将 stack 类放置在了命名空间 lty下,这是为了避免命名冲突和提供代码的组织结构。

stack 类模板定义:stack 类是一个模板类,有两个模板参数:T 表示栈中存储的元素类型,Container 表示底层容器的类型,默认为 std::deque<T>。

公共成员函数

push(const T& x):将传入的元素值 x 添加到底层容器的末尾,实现了入栈操作。


pop():从底层容器的末尾删除一个元素,实现了出栈操作。


T& top() 和 const T& top() const:分别返回底层容器的末尾元素的引用(允许修改)和常量引用(只读),实现了查看栈顶元素操作。


bool empty() const:返回底层容器是否为空。


size_t size() const:返回底层容器中元素的数量。


私有成员变量 _con:这是一个模板类的私有成员变量,用于存储实际的栈元素。其类型是根据模板参数 Container 确定的,在实例化时会被替换为具体的容器类型。

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要清空一个C++stack容器,有多种方法可以实现。 第一种方法是通过拷贝构造函数来复制一个空的stack容器。你可以使用以下代码实现: ```cpp std::stack<int> copy_stack = my_stack; ``` 这将创建一个新的stack容器copy_stack,它是一个空的副本。 第二种方法是通过直接创建一个新的空stack容器并将其与原来的stack容器进行交换。这可以通过以下代码实现: ```cpp std::stack<elemType>().swap(s); ``` 这将创建一个临时的空stack容器,然后使用swap函数将其与原来的stack容器s进行交换。最后,临时stack容器会被销毁,同时释放所有的内存空间。这种方法比逐个弹出元素要快。 第三种方法是通过循环将stack容器中的元素一个一个弹出来清空。你可以使用以下代码实现: ```cpp while (!s.empty()) { s.pop(); } ``` 这个方法逐个检查stack容器是否为空,如果不为空则调用pop函数弹出栈顶元素,直到stack容器为空为止。虽然这种方法比较繁琐,但也是一种有效的清空stack容器的方法。 所以,以上是三种清空C++stack容器的方法。你可以根据自己的需求选择合适的方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [[C++]stack使用总结](https://blog.csdn.net/qq525003138/article/details/107052849)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值