C++之stack & queue & deque

本文详细介绍了C++标准库中的三种容器:stack(栈)、queue(队列)和deque(双端队列)。每种容器都有其独特的特性和用法,通过具体的代码示例展示了如何使用这些容器进行数据管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                      C++之stack & queue & deque

目录

1 stack

2 queue

3 deque


1 stack

    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;    
    }  

 

2 queue

 

    与stack 模板类很相似,queue 模板类也需要两个模板参数,一个是元素类型,一个容器类
型,元素类型是必要的,容器类型是可选的,默认为deque 类型。

    queue 模板类的定义在头文件#include <queue>

    定义queue 对象:

queue<int> q1;
queue<double> q2;

    queue 的基本操作:

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

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

    3)访问队首元素:q.front(),即最早被压入队列的元素。

    4)访问队尾元素:q.back(),即最后被压入队列的元素。

    5)判断队列空:q.empty(),当队列空时,返回true。

    6)访问队列中的元素个数:q.size()

    举例:

#include <iostream>
#include <queue>

using namespace std;

int main()
{
	int e, n, m;
	queue<int> q1;
	for (int i = 0; i<10; i++)
		q1.push(i);
	if (!q1.empty())
		cout << "dui lie bu kong\n";
	n = q1.size();
	cout << n << endl;
	m = q1.back();
	cout << m << endl;
	for (int j = 0; j<n; j++)
	{
		e = q1.front();
		cout << e << " ";
		q1.pop();
	}
	cout << endl;
	if (q1.empty())
		cout << "dui lie kong\n";
	system("PAUSE");
	return 0;
}

 

3 deque

 

    所谓的deque是”double ended queue”的缩写,双端队列不论在尾部或头部插入元素,都十分迅速。而在中间插入元素则会比较费时,因为必须移动中间其他的元素。双端队列是一种随机访问的数据类型,提供了在序列两端快速插入和删除操作的功能,它可以在需要的时候改变自身大小,完成了标准的C++数据结构中队列的所有功能。

    头文件:#include<deque>。

    基本操作:

    1)deque<Type> k;      ------      定义一个deque的变量(定义时已经初始化)      例如: deque<int> k;

    2)k.empty()                  ------      查看是否为空范例,是的话返回1,不是返回0

    3)k.clear()                     ------      清除队列里的所有数据

    4)k.push_front(i)           ------      从已有元素前面增加元素i(队伍大小不预设)

    5)k.push_back(i)           ------      从已有元素后面增加元素i(队伍大小不预设)

   6) k.pop_front()             ------      清除第一个元素

   7) k.pop_back()             ------      清除最后一个元素

    8)k.front()                     ------      显示第一个元素      例如n = k.front();

   9) k.back()      ------      显示最后一个元素

   10) k.size()      ------      输出现有元素的个数

    举例:

    #include<stdio.h>  
    #include<deque>  
    using namespace std;  
    int main(void)  
    {  
        int i;  
        int a[10] = {0,1,2,3,4,5,6,7,8,9};  
        deque<int> q;  
        for(i=0;i<=9;i++)  
        {  
            if(i%2==0)  
                q.push_front(a[i]);  
            else  
                q.push_back(a[i]);  
        }                                  /*此时队列里的内容是: {8,6,4,2,0,1,3,5,7,9}*/  
        q.pop_front();  
        printf("%d\n", q.front());        /*清除第一个元素后输出第一个(6)*/  
        q.pop_back();  
        printf("%d\n", q.back());         /*清除最后一个元素后输出最后一个(7)*/  
        return 0;  
    }  

 

 

 

### C++ 中 `stack` 和 `queue` 的数据结构定义及用法 #### 定义与特性 在 C++ 标准库 `&lt;stack&gt;` 和 `&lt;queue&gt;` 中,`std::stack` 是一种后进先出(LIFO, Last In First Out)的数据结构,而 `std::queue` 则是一种先进先出(FIFO, First In First Out)的数据结构。这两种容器适配器都基于其他标准容器(如 `std::deque` 或 `std::list`)来实现。 对于 `std::stack` 而言,默认底层容器为 `std::deque`[^1]。它提供了三个主要的操作函数:`push()` 用于向栈顶添加元素;`pop()` 用于移除栈顶元素;以及 `top()` 返回当前栈顶的元素值[^3]。 而对于 `std::queue` 来说,默认同样使用 `std::deque` 作为底层容器[^2]。它的基本操作包括:`push()` 将新元素加入到队列尾部;`front()` 获取队首元素;`back()` 获取队尾元素;以及通过调用 `pop()` 移除队首元素。 #### 使用方法对比 以下是两种数据结构的具体使用示例: ##### Stack 示例代码 ```cpp #include &lt;iostream&gt; #include &lt;stack&gt; using namespace std; int main() { stack&lt;int&gt; stk; stk.push(1); stk.push(2); stk.push(3); while (!stk.empty()) { cout &lt;&lt; stk.top() &lt;&lt; &quot; &quot;; // 输出顺序应为 3 2 1 stk.pop(); } return 0; } ``` ##### Queue 示例代码 ```cpp #include &lt;iostream&gt; #include &lt;queue&gt; using namespace std; int main() { queue&lt;int&gt; que; que.push(1); que.push(2); que.push(3); while (!que.empty()) { cout &lt;&lt; que.front() &lt;&lt; &quot; &quot;; // 输出顺序应为 1 2 3 que.pop(); } return 0; } ``` 上述两段程序分别展示了如何利用 `std::stack` 实现 LIFO 行为和借助 `std::queue` 达成 FIFO 效果。 #### 主要区别总结 - **访问模式**: `std::stack` 只允许在一端进行插入和删除操作,即遵循 LIFO 原则;相反地,`std::queue` 支持两端操作&mdash;&mdash;一端入队另一端出队,体现 FIFO 特征。 - **功能范围**: 鉴于其单侧受限的特点,`std::stack` 更适合解决那些需要逆序处理或者递归模拟场景下的问题;而当面对诸如广度优先搜索(BFS)之类需按层次遍历的任务时,则更适合选用 `std::queue`[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值