stack&queue&list

环境:ide:Mac+clion

视频链接:
https://www.bilibili.com/video/BV1Hb411Y7E5?p=5

stack 容器,栈容器。先进后出。 类似于压子弹。只有一个出口。而且栈不允许有遍历的行为。

栈可以判断是否为空。可以判断栈的个数。
入栈:push
出栈:pop
栈顶元素:top
栈的大小:size

void test(){
    stack<int>s;//先进后出的容器。
    s.push(10);//入栈/压栈
    s.push(20);
    s.push(30);
    s.push(40);
    cout <<"入栈后的大小"<< s.size()<<endl;//4
    while(!s.empty()){
        cout << s.top()<<endl;//打印栈顶元素。
        s.pop();//出栈。
    }
    cout << "出栈后的大小"<<s.size()<<endl;//0
}

queue 先进先出的数据结构 和stack 正好相反。 有两个出口。 一头负责push,一头负责pop。 这样就保证了先进先出的特性。只有对头和对尾进行操作。 不允许遍历。

stl 提供了如下函数:入队push/出队pop/队尾back/队头front/是否为空empty/大小size

void test1(){
    queue<Person>q;//先进先出的数据结构。
    Person p1("sheik1",10);
    Person p2("sheik2",20);
    Person p3("sheik3",30);
    Person p4("sheik4",40);
    q.push(p1);//入队
    q.push(p2);
    q.push(p3);
    q.push(p4);
    cout << "queue 大小:"<<q.size()<<endl;
    while (!q.empty()){
        cout <<"队头中的数据姓名:"<< q.front().m_Name<<"  年龄:"<<q.front().m_Age<<endl;
        cout <<"队尾中的数据姓名:"<< q.back().m_Name<<"  年龄:"<<q.back().m_Age<<endl;
        q.pop();

    }
    cout << "queue 大小:"<<q.size()<<endl;
//    queue 大小:4
//    队头中的数据姓名:sheik1  年龄:10
//    队尾中的数据姓名:sheik4  年龄:40
//    队头中的数据姓名:sheik2  年龄:20
//    队尾中的数据姓名:sheik4  年龄:40
//    队头中的数据姓名:sheik3  年龄:30
//    队尾中的数据姓名:sheik4  年龄:40
//    队头中的数据姓名:sheik4  年龄:40
//    队尾中的数据姓名:sheik4  年龄:40
//    queue 大小:0
}

list 容器,将数据进行链式存储。数据中的逻辑是通过链表指针实现。由各种结点构成。结点是由数据域与指针域构成。

优点:就是可以快速的任意位置插入和删除。
缺点:
1.占用内存大。
2.遍历速度没有数组快。
STL中的链表是双向链表。
STL中list 和vector 是比较常用的容器。
list 构造和赋值:

void printList(const list<int> &l){
    for (list<int>::const_iterator it = l.begin();it!= l.end();it++){
        cout << *it << " ";
    }
    cout << endl;
}

void test2(){
    list<int>l;//默认构造函数。
    l.push_back(10);//尾插法,填入数据
    l.push_back(20);
    l.push_back(30);
    l.push_back(40);
    printList(l);
    list<int>l1(l);//这里类似于copy 构造函数
    printList(l1);
    list<int>l2(l.begin(),l.end());//通过区间来进行构造了
    printList(l2);
    list<int>l3(4,66);//使用66 初始化四个元素。
    printList(l3);
    list<int>l4 = l3;//直接使用operator=来进行赋值。
    printList(l4);

    list<int>l5 ;
    l5.assign(l1.begin(),l1.end());//通过assign的方式进行赋值。
    printList(l5);

    list<int>l6;
    l6.assign(4,777);//通过assign的方式进行赋值。
    printList(l6);
    l1.swap(l6);//交换。
    printList(l1);
    printList(l6);
}

list 大小:size/empty/resize 等函数。
list 容器的插入和删除:这里提供了一个remove 的函数,可以删除list 中某个elem。

void test3(){
    list<int>l;//默认构造函数。
    l.push_back(10);//尾插法,填入数据
    l.push_back(20);
    l.push_back(30);
    l.push_back(40);

    l.push_front(100);//头插法
    l.push_front(200);
    l.push_front(300);
    l.push_front(400);
    printList(l);//400 300 200 100 10 20 30 40

    l.pop_back();//尾删
    printList(l);//400 300 200 100 10 20 30
    l.pop_front();//头删
    printList(l);//300 200 100 10 20 30

//    插入
    l.insert(l.begin(),1);
    printList(l);//1 300 200 100 10 20 30
    list<int>::iterator it = l.begin();
    l.insert(++(++it),5);
    printList(l);

    //删除
    it = l.begin();
    l.erase(it);
    printList(l);
    l.push_back(5);
    printList(l);//300 5 200 100 10 20 30 5
    l.remove(5);//删除list 中所有=5的元素。
    printList(l);//300 200 100 10 20 30
    
};

list 容器数据存取:不支持[] 和at 访问list 里面的数据。

void test4(){
    list<int>l;//默认构造函数。
    l.push_back(10);//尾插法,填入数据
    l.push_back(20);
    l.push_back(30);
    l.push_back(40);
    //不支持[] 和at 访问list 里面的数据。
    cout<<"第一个元素:"<<l.front()<<endl;
    cout << "最后一个元素:"<<l.back()<<endl;
}

list 反转/排序,这里面有一个降序排序,引入了一个仿函数。

bool myCompare(int v1,int v2){
    return v1 > v2;//如果降序,那么就需要v1 > v2
}

void test5(){
    list<int>l;//默认构造函数。
    l.push_back(10);//尾插法,填入数据
    l.push_back(30);
    l.push_back(20);
    l.push_back(40);
    cout << "反转前打印:"<<endl;
    printList(l);//10 30 20 40
    l.reverse();
    cout << "反转后打印:"<<endl;
    printList(l);//40 20 30 10
    l.sort();//默认排序规则:从小到大
    cout << "排序后打印:"<<endl;
    printList(l);//10 20 30 40
    cout << "降序后打印:"<<endl;
    l.sort(myCompare);//降序排序,需要引入仿函数。
    printList(l);//40 30 20 10
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容