C++中stack用法

c++ stl栈容器stack用法介绍

stack堆栈容器

堆栈是一个线性表,插入和删除只在表的一端进行。这一端称为栈顶(Stack Top),另一端则为栈底(Stack Bottom)。堆栈的元素插入称为入栈,元素的删除称为出栈。由于元素的入栈和出栈总在栈顶进行,因此,堆栈是一个后进先出(Last In First Out)表,即 LIFO 表。

C++ STL 的堆栈泛化是直接通过现有的序列容器来实现的,默认使用双端队列deque的数据结构,当然,可以采用其他线性结构(vector 或 list等),只要提供堆栈的入栈、出栈、栈顶元素访问和判断是否为空的操作即可。由于堆栈的底层使用的是其他容器,因此,堆栈可看做是一种适配器,将一种容器转换为另一种容器(堆栈容器)。

为了严格遵循堆栈的数据后进先出原则,stack 不提供元素的任何迭代器操作,因此,stack 容器也就不会向外部提供可用的前向或反向迭代器类型。
stack堆栈容器的C++标准头文件为 stack ,必须用宏语句 “#include ” 包含进来,才可对 stack 堆栈的程序进行编译。

栈(Stack):
如下图所示,是一个5个单位的栈存储数据如下图所示,
如存入1,2,3,4,5.那么它的出栈序列可以为5,4,3,2,1.
其功能为入栈(压栈)push(int x), 出栈pop(), 取出栈的元素
top();
在这里插入图片描述

#include <iostream>
#include <cstdio>
#include <stack>
using namespace std;
int main()
{
	stack<int> S;
	S.push(1);
	S.push(2);
	S.push(3);
	cout<<S.top()<<endl;
	S.pop();
	cout<<S.top()<<endl;
	S.pop();
	cout<<S.top()<<endl;
	S.pop();
	return 0;
}

//----------------------------------------- 读取堆栈的栈顶元素
#include <stack>
#include <iostream>
using namespace std;
int main()
{
    // 创建堆栈对象
    stack<int> s;
    // 元素入栈
    s.push(3);
    s.push(19);
    s.push(23);
    s.push(36);
    s.push(50);
    s.push(4);

    // 元素依次出栈
    while(!s.empty())
    {
        // 打印栈顶元素,打印出:4 50 36 23 19 3
        cout << s.top() << endl;
        // 出栈
        s.pop();
    }

    return 0;
}


/*    堆栈的大小
堆栈的元素个数可用 size 函数获得。每次元素入栈前,先检查当前堆栈的大小,超过某个界限值,则不允许元素入栈,以此可实现一个具有一定容量限制的堆栈。
size_type  size()
返回当前堆栈的元素个数

下面的示例程序,将堆栈的大小设置为 100int 元素,而且使用 list 双向链表做堆栈的底层容器,每次压入元素时均判断堆栈的大小是否超过100个元素的界限,从而实现具有容量限制的堆栈。

#include <stack>
#include <list>
#include <iostream>
#define STACK_SIZE  100   // 堆栈最大容量
using namespace std;
int main()
{
    // 用双向链表作堆栈的底层结构
    stack<int, list<int> >   s; 
    // 堆栈未满,元素才能入栈
    if (s.size() < STACK_SIZE)
        s.push(68);
    if (s.size() < STACK_SIZE)
        s.push(1);
    if (s.size() < STACK_SIZE)
        s.push(17);
    // 元素出栈
    while (!s.empty())
    {
        // 打印 17 1 68
        cout << s.top() << endl;
        s.pop();
    }

    return 0;
}

堆栈是一种应用非常广泛的数据结构。C++ STL 将这种数据结构和它若干受限制操作用泛型类 stack 容器封装出来,包括堆栈初始化、元素入栈、取栈顶元素、元素出栈、判断堆栈是否非空和取得当前堆栈大小等,应用起来十分容易。
stack的元素出栈操作是不返回栈顶元素的,需要另外通过取栈顶函数获得。这种分离实现是考虑到出栈函数若直接返回栈顶元素,将会导致返回值的数据引用安全问题或不必要的低效复制函数的调用。

#include<stack>

stack<int>s1;

stack<string>s2;

stack的基本操作有:

1.入栈:如s.push(x);

2.出栈:如 s.pop().注意:出栈操作只是删除栈顶的元素,并不返回该元素。

3.访问栈顶:如s.top();

4.判断栈空:如s.empty().当栈空时返回true5.访问栈中的元素个数,如s.size();

创建 stack 对象
使用堆栈前,先要利用构造函数进行初始化,创建一个堆栈对象,以进行元素的入栈、出栈等操作。

  1. stack()
    默认构造函数,创建一个空的 stack 对象。
    例如,下面一行代码使用默认的 deque 为底层容器,创建一个空的堆栈对象 s 。
 stack<int>  s;

1 stack(const stack&)
复制构造函数,用一个 stack 堆栈创建一个新的堆栈。
例如,下面的代码利用 s1 ,创建一个以双向链表为底层容器的空堆栈对象 s2 。

// stack<int, list<int> >   s1;
    stack<int, list<int> >   s2(s1);

元素入栈
stack堆栈容器的元素入栈函数为 push 函数。由于 C++ STL 的堆栈函数是不预设大小的,因此,入栈函数就不考虑堆栈空间是否为满,均将元素压入堆栈,从而函数没有标明入栈成功与否的返回值。
如下是他的使用原型:
void push(const value_type& x)

元素出栈
stack容器的元素出栈函数为 pop 函数,由于函数并没有判断堆栈是否为空,才进行元素的弹出,因此,需要自行判断堆栈是否为空,才可执行 pop 函数。

  void pop()

    下面的示例代码,将堆栈的所有元素全部出栈
    // stack<int>  s;
    while(!s.empty())
    { 
        s.pop();// 出栈
    }
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值