zoukankan      html  css  js  c++  java
  • C++ STL stack 用法

    Stack(栈)是一种后进先出的数据结构,也就是LIFO(last in first out) ,最后加入栈的元素将最先被取出来,在栈的同一端进行数据的插入与取出,这一段叫做“栈顶”。

    使用STL的stack需要include一个头文件<stack>

    构造

    template <class T, class Container = deque<T> > class stack;

    如上,这对尖括号中有两个参数,第一个是T,表示栈中存放的数据的类型,比如int,double,或者结构体之类。

    第二个参数指明底层实现的容器类型,也就是指明这个栈的内部实现方式,比如vector,deque,list。如果不指明它,默认使用deque(双端队列)。当然一般情况下不需要指定这一项参数。

    直接看栗子、

    // 构造 stacks
    #include <iostream>
    #include <stack>          // 使用栈stack
    #include <vector>         // vector
    #include <deque>          // deque
    using namespace std;
    
    int main ()
    {
        stack<int> first;                    //构造一个用于存放int类型的空栈(默认底层容器为deque),size=0。这是最简单也是最常用的方式 ٩(๑❛ᴗ❛๑)۶如果感觉别的方式太复杂,会用这一种就行
        
        deque<int> mydeque (3,100);          //构造一个包含3个int元素的双端队列
        stack<int> second (mydeque);         //用自己的双端队列构造一个栈(size=3)
    
        stack<int,vector<int> > third;          //指明用vector实现一个栈(存放int),空栈size=0
        
        vector<int> myvector (2,200);        //构造一个存放2个元素的vector
        stack<int,vector<int> > fourth (myvector);   //用自己的vector构造一个栈,size=2
    
        //输出四个栈的大小
        cout << "size of first: " << first.size() << endl;
        cout << "size of second: " << second.size() << endl;
        cout << "size of third: " << third.size() << endl;
        cout << "size of fourth: " << fourth.size() << endl;
    
        return 0;
    }    

    输出结果:

    size of first: 0
    size of second: 3
    size of third: 0
    size of fourth: 2

    成员函数

    先说一些常用的,直接看栗子୧(๑•̀⌄•́๑)૭

    #include <iostream> 
    #include <stack>  
    using namespace std;
    
    int main ()
    {
      stack<int> mystack;
    
        for (int i=0; i<5; ++i) mystack.push(i);        //push函数将参数元素加入栈中,没有返回值(例如这里循环将0,1,2,3,4加入栈中,注意栈顶元素是4)
        cout << "size: " << mystack.size() << endl;   //size函数返回栈的大小(此时有5个元素,size=5)
    
        while (!mystack.empty())            //empty函数返回一个bool值,栈为空时返回true,否则返回false
        {
            cout << ' ' << mystack.top();            //top函数的返回值是栈顶元素(注意并没有删掉栈顶元素)
            mystack.pop();                //pop函数将栈顶元素删掉,没有返回值
        }
      cout << endl;
    
      return 0;
    }    

    运行结果:

    size: 5
     4 3 2 1 0

    再来看另一组栗子:

    #include <iostream>       
    #include <stack>
    using namespace std;
    
    struct Node {
        int a,b;
        Node (int x, int y) {
            a = x; b = y;
        }
    };
    
    int main ()
    {
        stack<Node> mystack;
        mystack.emplace(1,2);        //emplace函数可以将一个元素加入栈中,与push的区别在于:emplace可以直接传入Node的构造函数的参数,并将构造的元素加入栈中
        //mystack.push(1,2);        //编译不通过,要达到上面的效果需要手动构造,例如mystack.push(Node(1,2));
        Node p = mystack.top();
        cout << p.a << " " << p.b << endl;
        
        stack<Node> my2;
        my2.swap(mystack);            //swap函数可以交换两个栈的元素
        cout << mystack.size() << " " << my2.size() << endl;
    
    
      return 0;
    }

    运行结果:

    1 2
    0 1

    以上就是stack的常规操作

  • 相关阅读:
    HDU 1102 Constructing Roads
    HDU 1285 确定比赛名次。
    最小生成树 HDU 各种畅通工程的题,prim和kru的模板题
    HDU Jungle Roads 1301 最小生成树、
    并查集小结(转)
    HDU hdu 2094 产生冠军 拓扑排序 判定环
    模运算(转)
    拓扑排序(主要是确定环和加法) HDU 2647 Reward
    HDU 1372 Knight Moves 简单BFS
    用计算机模型浅析人与人之间沟通方式 (一)如何谈话
  • 原文地址:https://www.cnblogs.com/magisk/p/9193351.html
Copyright © 2011-2022 走看看