C++ 栈和队列的介绍与使用

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

使用标准库的栈和队列时,先包含相关的头文件

#include<stack>

#include<queue>

定义栈如下:

stack<int> stk;

定义队列如下:

queue<int> q;

栈提供了如下的操作

s.empty()               如果栈为空返回true,否则返回false
s.size()                返回栈中元素的个数
s.pop()                 删除栈顶元素但不返回其值
s.top()                 返回栈顶的元素,但不删除该元素
s.push()                在栈顶压入新元素

队列提供了下面的操作

q.empty()               如果队列为空返回true,否则返回false
q.size()                返回队列中元素的个数
q.pop()                 删除队列首元素但不返回其值
q.front()               返回队首元素的值,但不删除该元素
q.push()                在队尾压入新元素
q.back()                返回队列尾元素的值,但不删除该元素

c++stack(堆栈)

它是一个容器的改编,它实现了一个先进后出的数据结构(FILO)

使用该容器时需要包含#include<stack>头文件;

定义stack对象的示例代码如下:

stack<int>s1;

stack<string>s2;

stack的基本操作有:

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

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

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

4.判断栈空:如s.empty().当栈空时返回true。

5.访问栈中的元素个数,如s.size();

下面举一个简单的例子:

    #include<iostream>  
    #include<stack>  
    using namespace std;  
    int main(void)  
    {  
        stack<double>s;//定义一个栈  
        for(int i=0;i<10;i++)  
            s.push(i);  
        while(!s.empty())  
        {  
            printf("%lf\n",s.top());  
            s.pop();  
        }  
        cout<<"栈内的元素的个数为:"<<s.size()<<endl;  
        return 0;  
    }  

栈的定义:

栈是限定仅在表尾进行插入或删除操作的线性表,因此表尾端成为栈顶,相应的,表头端成为栈底,不含有任何元素的栈称为空栈。
栈的修改遵循后进先出的原则,因此栈又称为后进先出的线性表,简称LIFO结构。
栈一般采用数组作为其存储结构,这样做可以避免使用指针,简化程序,当然数组需要预先声明静态数据区的大小,但这不是问题,因为即便是频繁进出入栈操作,任何时刻栈元素的实际个数也不会很多,为栈预留一个足够大但又不占用太多空间并不是很困难,如果不能做到这一点,那么节省内存的方法就是使用链表存储栈。
线性表实现栈的基本操作
    #include<iostream>  
    #include<cstdio>  
    using namespace std;  
    typedef struct Stacknode//定义链式栈的结构体  
    {  
        int data;//数据域  
        Stacknode *next;//下一节点的指针域  
    }Stacknode,*Stack;  
    //初始化一个链式栈(返回一个链式栈的头节点)  
    Stack InitStack()  
    {  
        Stack stack=(Stack)malloc(sizeof(Stacknode));  
        stack->next=NULL;  
        return stack;  
    }  
    //入栈  
    void Push(Stack stack,int newData)  
    {  
        //判断是否为空  
        if(stack==NULL)  
        {  
            printf("栈未初始化,请初始化以后再使用\n");  
            return;  
        }  
        //找到最后一个节点  
       Stacknode *lastnode=stack;  
       while(lastnode->next)  
        {  
        lastnode=lastnode->next;  
        }  
       lastnode->next=(Stacknode*)malloc(sizeof(Stacknode*));  
       lastnode->next->data=newData;  
       lastnode->next->next=NULL;  
       printf("入栈成功!\n");  
    }  
    //出栈  
    int Pop(Stack stack)  
    {  
        //判断栈是否为空  
        if(!stack->next)  
        {  
            printf("栈为空,无法出栈\n");  
            return -1;//-1只是一个自定义的错误代码  
        }  
        //找到最后一个节点的钱一个节点  
        //tempNode:最后一个节点的前一个节点  
        Stacknode *tempNode=stack;  
        while(tempNode->next->next)  
        {  
            tempNode=tempNode->next;  
        }  
        int data=tempNode->next->data;  
        free(tempNode->next);  
        tempNode->next=NULL;  
        return data;  
    }  
      
    int main()  
    {  
        Stack stack=InitStack();  
        Push(stack,3);//3进栈  
        Push(stack,4);//4进栈  
        Push(stack,5);//5进栈  
        printf("%d\n",Pop(stack));  
        printf("%d\n",Pop(stack));  
        printf("%d\n",Pop(stack));  
        printf("%d\n",Pop(stack));//第4次出栈,应该出错  
        return 0;  
    }  

C++ Queue(队列)

queue模版类的定义在<queue>头文件中。

queue与stack模版非常类似,queue模版也需要定义两个模版参数,一个是元素类型,一个是容器类型,元素类型是必要的,容器类型是可选的,默认为dqueue类型

定义queue对象的示例代码如下:

queue<int>q1;

queue<double>q2;

queue的基本操作有:

1.入队:如q.push(x):将x元素接到队列的末端;

2.出队:如q.pop() 弹出队列的第一个元素,并不会返回元素的值;

3,访问队首元素:如q.front()

4,访问队尾元素,如q.back();

5,访问队中的元素个数,如q.size();

二.优先队列

<queue>头文件中,还定义了一个非常有用的模版类priority_queue(优先队列),优先队列与队列的差别在于优先队列不是按照入队的顺序出队,而是按照队列中元素的优先权顺序出队(默认为大者优先,也可以通过指定算子来指定自己的优先顺序)默认是一个大根堆

priority_queue模版类有三个模版参数,元素类型,容器类型,比较算子。其中后两个都可以省略,默认容器为vector,默认算子为less,即小的往前排,大的往后排(出队时序列尾的元素出队)。

定义priority_queue对象的示例代码如下:

priority_queue<int >q1;

priority_queue<pair<int,int> >q2;

priority_queue<int,vector<int>,greater<int> >q3;//定义小的先出队

priority_queue的基本操作均与queue相同

初学者在使用priority_queue时,最困难的可能就是如何定义比较算子了。如果是基本数据类型,或已定义了比较运算符的类,可以直接用STL的less算子和greater算子——默认为使用less算子,即小的往前排,大的先出队。如果要定义自己的比较算子,方法有多种,这里介绍其中的一种:重载比较运算符。优先队列试图将两个元素x和y代入比较运算符(对less算子,调用x<y,对greater算子,调用x>y),若结果为真,则x排在y前面,y将先于x出队,反之,则将y排在x前面,x将先出队。

看下面这个简单的示例:

    #include<iostream>  
    #include<queue>  
    #include<stdlib.h>  
    using namespace std;  
    class T  
    {  
    public:  
        int x,y,z;  
        T(int a,int b,int c):x(a),y(b),z(c)  
        {  
        }  
    };  
    bool operator<(const T&t1,const T&t2)  
    {  
        return t1.z<t2.z;  
    }  
    int main(void)  
    {  
        priority_queue<T>q;  
        q.push(T(4,4,3));  
        q.push(T(2,2,5));  
        q.push(T(1,5,4));  
        q.push(T(3,3,6));  
        while(!q.empty())  
        {  
            T t=q.top();  
            q.pop();  
            cout<<t.x<<" "<<t.y<<" "<<t.z<<endl;  
        }  
        system("Pause");  
        return 1;  
    }  

输出结果为

注意这里是按照z的顺序从大到小出队的。

如果我们把上述例子中的比较运算符重载改为:

bool operator<(const T &t1,const T &t2)

{

return t1.z>t2.z;

}

那么得到的输出结果将会按照z的顺序从小到大出队。


C++(stack)详解 C++详解 阅读详情

相关推荐

c++详解

在算法的优化中,有一种经常使用的技巧就是单调性(递增或递减)的运用。比如要保证的元素是单调递增的,当要进入的元素比顶元素小时,就要弹出顶元素或者丢掉这个元素不进入。从第1天开始用直线连接后面的某些天的股价,希望连线是递增的,并且所有股价不会超过这些直线。l push操作:向一个插入新元素又称作进、入或压,它是把新元素放到顶元素的上面,使之成为新的顶元素;l pop操作:从一个删除元素又称作出或退,它是把顶元素删除掉,使其相邻的元素成为新的顶元素。例如有任务:增长折线。

浪子回头 3835

C++数据结构之

的应用场景非常广泛,包括代码中的解析、数据结构中的树图的遍历以及计算机系统中的内存分配等等。本文会介绍

现役 OIer。 1万+

队列(用C++实现队列

是一种后进先出的线型结构,C++实现的代码如下: #include using namespace std; #define MAXLEN 50 typedef struct { char key[10]; char name[20]; int age; }Data; typedef struct { Data nodeData[MAXLEN+1]; int top; }St

赞美月亮的专栏 4354

C++

1. 的简介 1.1的特点 stack)是以一种线性存储结构,它具有一下特点:中的数据元素遵守“先进后出(First in Last out)”的原则,简称FILO结构;限定只能在顶进行插入删除操作。 1.2的相关概念 的相关概念: 1.2.1 底:允许元素插入删除的一端称为顶,另一端成为底。 1.2.2 压的插入操作,叫做进,也称压,入。 1.2.3 弹的删除操作,也叫做出。 例如我们有一个存储整型元素的,我们依次压:{1,2,3}

qq_40041064的博客 1万+

C++~~(很详细哦)

C++~~(很详细哦)

weixin_71138261的博客 7962

C++ 队列使用介绍

stackqueue的简单介绍,以及什么是容器适配器队列底层容器deque的介绍

2401_84541745的博客 835

C++STL的Stack使用:STL队列使用介绍、leecode---最小、nowcoder---的压入、弹出序列等的介绍

C++STL的Stack使用:STL队列使用介绍、leecode—最小、nowcoder—的压入、弹出序列等的介绍C++STL的Stack使用:STL队列使用介绍、leecode—最小、nowcoder—的压入、弹出序列等的介绍

Farewell_me的博客 585

C++队列

leetcode刷题基础

sinat_40628756的博客 2111

【刷题篇】队列

各位小友们好久不见,甚是想念!前段时间我们学习了两个重要的数据结构---队列。有效的括号用队列实现实现队列注:为了实现方便,本期我们将使用C++来编写代码,利用STL中现有的队列进行实现。

忆梦初心的博客 1060

C++刷题 -- 队列

力扣链接 2.用队列实现 用两个队列实现 时间复杂度: pop为O(n),其他为O(1) 空间复杂度: O(n) 只用一个队列实现: 时间复杂度: pop为O(n),其他为O(1) 空间复杂度: O(n) 3.有效的括号 有效的括号 括号匹配是使用解决的经典问题 如果还记得编译原理的话,编译器在 词法分析的过程中处理括号、花括号等这个符号的逻辑,也是使用这种数据结构。 再举个例子,linux系统中,cd这个进入目录的命令我们应该再熟悉不过了。 这个命令最后进入a目录,系统是如何知道进入了

kissland96166的博客 1059

C++队列

使用标准库的队列时,先包含相关的头文件 #include<stack> #include<queue> 定义如下: stack<int> stk; 定义队列如下: queue<int> q; 1 1、(Stack)是一种线性存储结构,它具有如下特点: (1)中的数据元素遵守“先进后出"(First In Last Ou...

Young_Fan 423

队列使用及模拟实现

stackqueue,deque相关内容介绍

qq_55958734的博客 1003

【23考研】408代码题参考模板——队列C++STL)

队列对应的结构体为queue,同一样需要在尖括号中指明队列中需要存放的元素类型。//定义一个存放int类型元素的队列

3903

LeetCode Day10 队列: 232.用实现队列,225. 用队列实现

(1) 模拟的:单队列:1 2 3(2) 弹出3模拟的:单队列:3 1 2 <--

iuhnkjgyi的博客 774

队列 1. 队列相关概念记录

以下是以C++为例,使用其他编程语言的同学也对应思考一下,自己使用的编程语言里队列是什么样的。的内部结构,的底层实现可以是vector,deque,list 都是可以的, 主要就是数组链表的底层实现。C++标准库是有多个版本的,要知道我们使用的STL是哪个版本,才能知道对应的队列的实现原理。接下来介绍队列也是SGI STL里面的数据结构, 知道了使用版本,才知道对应的底层实现。​ 来实现的功能。我这里讲的都是C++ 语言中的情况, 使用其他语言的同学也要思考队列的底层实现问题。

m0_49844155的博客 720

队列知识总结

是一种只能在一端进行插入或删除操作的线性表,也称为后进后出表。队列简称队,是一种仅允许在表的一端进行插入操作,而在表的另一端进行删除操作的线性表,也称为先进先出表。

STRANGEX-03的博客 787

算法训练营第10天-队列01|232.用实现队列,225.用队列实现

pop操作:若输出为空,则将输入中的元素依次push进输出,最后输出pop;六大组件:容器(Containers),分配器(Allocators),算法(Algorithm),迭代器(Iterators),适配器(Adapters),仿函数(Functors)pop操作:将q1中除最后一个元素外都push进q2并pop,然后pop掉最后一个元素,再将q2赋值给q1,最后清空q2。3.优化思路:只用一个队列,pop操作只需要把除最后一个元素外的其他元素依次放到队尾,最后pop掉那个元素即可。

m0_67846961的博客 962

代码随想录-05-队列-03.用队列实现

队列实现

qq_55675237的博客 361
上一篇: 算法导论:回文子串(Manacher)算法 ,O(n)时间效率实现
下一篇: 二叉树遍历,栈实现二叉树的非递归遍历
tham_
博客等级 码龄12年 233粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值