C++ STL标准库:std::stack堆栈的使用 入栈push() 出栈pop() 获取元素top()

LIFO堆栈

堆栈是一种容器适配器,专门设计用于在LIFO环境(后进先出)中操作,在该环境中,仅从容器的一端插入和提取元素。

堆栈被实现为容器适配器,它们是使用特定容器类的封装对象作为其基础容器的类,提供了一组特定的成员函数来访问其元素。 元素从特定容器的“后部”被推入/弹出,这被称为堆栈的顶部。

基础容器可以是任何标准容器类模板或某些其他专门设计的容器类。 容器应支持以下操作:

  • empty
  • size
  • back
  • push_back
  • pop_back

标准容器类vectordequelist满足这些要求。 默认情况下,如果没有为特定的堆栈类实例指定容器类,则使用标准容器deque

std::stack::empty

函数原型:

bool empty() const;

测试容器是否为空

返回堆栈是否为空:即其大小是否为零。

该成员函数有效地将成员清空底层容器对象。

参数:

返回值:
如果基础容器的大小为0,则为true,否则为false。


std::stack::size

函数原型:

size_type size() const;

返回堆栈中的元素数。

该成员函数有效地调用基础容器对象的成员大小。

参数:

返回值:
基础容器中的元素数。

成员类型size_type是无符号整数类型。


std::stack::top

函数原型:

      reference& top();
const_reference& top() const;

返回对栈顶元素的引用。

由于堆栈是后进先出容器,因此top元素是插入堆栈中的最后一个元素。

该成员函数有效地将成员调用回基础容器对象。

参数:

返回值:
对栈顶元素的引用。


std::stack::push

函数原型:

void push (const value_type& val);
void push (value_type&& val);

插入元素

在堆栈顶部的当前顶部元素上方插入一个新元素。 此新元素的内容被初始化为val的副本。

该成员函数有效地调用基础容器对象的成员函数push_back。

参数:
val:
插入的元素初始化为的值。

成员类型value_type是容器中元素的类型(定义为第一类模板参数T的别名)。

返回值:
none


std::stack::emplace (C++11)

函数原型:

template <class... Args> void emplace (Args&&... args);

构造并插入元素

在堆栈顶部的当前顶部元素上方添加一个新元素。 这个新元素通过传递args作为其构造函数的参数而就地构造。

该成员函数有效地调用基础容器的成员函数emplace_back,转发args。

参数:
args:
用于构造新元素的参数。

返回值:
none


std::stack::pop

函数原型:

void pop();

删除顶部元素

删除堆栈顶部的元素,有效地将其大小减小了一个。

删除的元素是插入堆栈中的最新元素,可以通过调用成员stack :: top检索其值。

这将调用已删除元素的析构函数。

该成员函数有效地调用基础容器对象的成员函数pop_back。

参数:

返回值:


std::stack::swap(C++11)

函数原型:

void swap (stack& x) noexcept(/*see below*/);

交换内容

用x交换容器适配器(* this)的内容。

该成员函数调用非成员函数swap(不合格)来交换基础容器。

noexcept说明符与基础容器上的交换操作匹配。

参数:
x:
另一个相同类型的堆栈容器适配器(即,使用相同的模板参数T和Container实例化)。 大小可能会有所不同。

返回值:
none


#include <iostream>
#include <stack>
#include <string>
#include <list>
#include <assert.h>

using namespace std;

void main()
{	 
	stack<string,list<string> > s1;
	s1.push("苹果");
	cout<<"\"苹果\" 放入堆栈中.  "<<endl;
	s1.push("香蕉");
	cout<<"\"香蕉\" 放入堆栈中.  "<<endl;
	s1.push("梨子");
	cout<<"\"梨子\" 放入堆栈中.  "<<endl;
	s1.push("西瓜");
	cout<<"\"西瓜\" 放入堆栈中.  "<<endl;

	assert(s1.size()==4);
	assert(s1.top()=="西瓜") ;

	cout<<"将元素从栈顶弹出."<<endl;
	while(s1.size())
	{	 
		cout<<"  "<<s1.top()<<endl;
		s1.pop();
	}
}

在这里插入图片描述

好的,我明白你的问题了。以下是一个使用结构体实现堆栈的示例代码,你可以参考一下: ```c++ #include <iostream> // 定义堆栈结构体 struct Stack { int *data; // 存储数据的数组 int capacity; // 堆栈容量 int top; // 顶指针 }; // 初始化堆栈 void init(Stack &s, int capacity) { s.capacity = capacity; s.top = -1; s.data = new int[capacity]; } // 判断堆栈是否为空 bool is_empty(Stack &s) { return s.top == -1; } // 判断堆栈是否已满 bool is_full(Stack &s) { return s.top == s.capacity - 1; } // 操作 void push(Stack &s, int x) { if (is_full(s)) { std::cout << "Stack is full!" << std::endl; return; } s.top++; s.data[s.top] = x; } // 出栈操作 void pop(Stack &s) { if (is_empty(s)) { std::cout << "Stack is empty!" << std::endl; return; } s.top--; } // 返回元素 int top(Stack &s) { if (is_empty(s)) { std::cout << "Stack is empty!" << std::endl; return -1; } return s.data[s.top]; } // 打印堆栈中的所有元素 void print(Stack &s) { if (is_empty(s)) { std::cout << "Stack is empty!" << std::endl; return; } for (int i = 0; i <= s.top; i++) { std::cout << s.data[i] << " "; } std::cout << std::endl; } int main() { Stack s; init(s, 5); // 初始化容量为5的堆栈 push(s, 1); push(s, 2); push(s, 3); print(s); // 输出 "1 2 3" pop(s); print(s); // 输出 "1 2" std::cout << top(s) << std::endl; // 输出 "2" return 0; } ``` 你可以在输多组出栈操作后,调用 `print` 函数来展示当前堆栈中的所有元素。注意,在代码中,我们使用 `new` 关键字来动态分配数组空间,并在程序结束时使用 `delete` 关键字来释放空间。 希望这个示例代码对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级D洋葱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值