STL包含一些为满足特殊需求而设计的容器,
他们提供简单而清晰的接口:
1.Stack
2.Queue
3.Priority Queue
4.bitset
本文介绍Stack.
Stack(也称LIFO,即后进先出)的声明如下:
template<typename _Tp, typename _Sequence = deque<_Tp> >
class stack;
第一个template代表元素类型
第二个template代表stack内部存放元素所用的实际容器,缺省用deque。
之所以选择deque而不是vector是因为:
1.deque移除元素时候会释放内存,
2.deque不必在重新分配内存是复制全部元素
实际上,stack只是很单纯的把各项操作转换为内部容器的对应调用。这从其实现代码也可以看出,下面是stack的源代码,这里去掉了value_type等声明和构造析构函数等,主要列举了几个常用的接口:
protected:
_Sequence c; ///内部容器
public:
bool empty() const { return c.empty(); }
size_type size() const { return c.size(); }
reference top() ///注意top返回的是reference
{
__glibcxx_requires_nonempty();
return c.back();
}
const_reference top() const
{
__glibcxx_requires_nonempty();
return c.back();
}
void push(const value_type& __x)
{ c.push_back(__x); }
void pop()
{
__glibcxx_requires_nonempty();
c.pop_back();
}
我们可以使用任何序列式容器来支持stack,
只要他们支持back(),push_back(),pop_back()等动作就行。
如以vector支持stack可定义: stack<int,vector<int> > intStack;
核心接口(源代码中可以看出其实现):
1.push()
2.pop()
3.top()
4.size()
5.empty()
6.comparision(const stack& s1,const stack& s2) ///两个同型stack的比较,
comparision可以是:==,!=,<,>,<=,>=
(如果两个stack的size()相等并且对应元素也相等则它们相等;比较基于字典序,参考lexicographical_compare())
下面是stack的一个简单的应用:
void testStack()
{
stack<int> intStack;
for(int i=1;i<10;++i)
intStack.push(i);
cout<<"Size = "<<intStack.size()<<endl;
string empty = intStack.empty()?"True":"False";
cout<<"Empty = "<<empty<<endl;
cout<<"Stack top() = "<<intStack.top()<<endl;
intStack.top() = 100; ///利用top()返回reference修改top值
cout<<"Stack All Elements: ";
while(!intStack.empty())
{
cout<<intStack.top()<<" ";
intStack.pop();
}
cout<<endl;
}
c++中stack,deque,queue对比
stack堆栈,没有迭代器,支持push()方法。后进先出,top()返回最顶端的元素,pop()剔除最顶元素
deque双端队列,支持迭代器,有push_back()方法,跟vector差不多,比vector多了个pop_front,push_front方法
queue队列,先进先出,不支持迭代器,有push()方法,pop()剔除第一个元素,front()返回第一个元素
代码如下:
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int main(){
stack<int>s;
for(int i=1;i<=10;++i){
s.push(i);
}
for(int j=0;j<10;++j){
cout<<s.top()<<" ";
s.pop();
}
cout<<endl;
system("pause");
return 0;
}
#include<iostream>
#include<string>
#include<deque>
using namespace std;
int main(){
deque<int>q;
for(int i=0;i<10;++i){
q.push_back(i);
}
cout<<q.front()<<endl;
for(deque<int>::iterator iter=q.begin();iter!=q.end();++iter){
cout<<*iter<<" ";
}
cout<<endl;
cout<<q.back()<<endl;
system("pause");
return 0;
}
#include<iostream>
#include<queue>
#include<string>
using namespace std;
int main(){
queue<int>q;
for(int i=0;i<10;++i){
q.push(i);
}
for(int i=0;i<10;++i){
cout<<q.front()<<" ";
q.pop();
}
cout<<endl;
system("pause");
return 0;
}
分享到:
相关推荐
### C++中Stack与Queue的艺术 #### 数据结构实现 在深入了解C++中栈(Stack)与队列(Queue)之前,我们首先需要明确这两种数据结构的基本概念及其在C++中的实现方式。 - **栈(Stack)**: 栈是一种后进先出...
### C++ STL中Stack和Queue的使用详解 #### 一、引言 在C++标准模板库(STL)中,提供了许多高效的容器类,其中包括`stack`和`queue`。这两种容器非常适合处理需要先进后出(FILO, First In Last Out)或先进先出(FIFO,...
本资料“Stack_Queue_Stack_源码.zip”可能包含了一些关于栈和队列的实现源代码,可能是用C++、Java或Python等编程语言编写的。下面我们将深入探讨这两种数据结构以及它们的应用。 1. 栈(Stack) 栈是一种后进先出...
在实际编程中,我们可以通过数组、链表或者特定的数据结构(如C++的`std::stack`和`std::queue`,Python的`collections.deque`)来实现栈和队列。理解并熟练掌握这两种数据结构,对于提升编程能力大有裨益。
C++ STL(Standard Template Library,标准模板库)提供了两种特殊的线性容器:stack(栈)和queue(队列),它们都是基于顺序容器(如vector或deque)实现的抽象数据类型,用于实现特定的数据操作逻辑。 **1. ...
在C++中,可以使用标准模板库(STL)中的`stack`容器来实现堆栈。堆栈的主要操作包括压栈(push)、弹栈(pop)、查看栈顶元素(top)以及检查栈是否为空(empty)。堆栈在递归、表达式求值、回溯算法等方面有着广泛...
在C++编程语言中,`stack`是一种标准模板库(STL)容器,它实现了后进先出(LIFO)的数据结构,常被用作堆栈。本文将深入解析`stack`类模板的源代码,帮助你理解和运用这个重要的数据结构。 首先,`stack`并不是一个...
顺序容器包括 vector、deque、list 等,关联容器包括 set、multiset、map、multimap 等,容器适配器包括 stack、queue、priority_queue 等。 顺序容器是 STL 中的一种基本容器,用于存放各种类型的数据。顺序容器...
在C++中,`std::stack`是一个模板类,通常基于`std::deque`或`std::vector`实现。Python中没有内置的`stack`,但可以使用列表(`list`)模拟栈的行为。栈常用于表达式求值、函数调用、深度优先搜索(DFS)等场景。 ...
来获取queue中的元素数量,使用q.empty();判断queue是否为空。 5. 元素入队:使用q.push(value);将元素添加到queue的尾部。 6. 元素出队:使用q.pop();可以从queue中移除头部元素。 四、priority_queue优先队列...
C++ STL中的queue是一个接口,实际的实现通常依赖于底层的deque或list。 7. **set**:集合是一个不包含重复元素的容器,元素自动排序。set的实现通常基于红黑树,确保插入、查找和删除操作的时间复杂度为O(log n)。...
本文将总结C++ STL中的主要容器和算法,包括vector、deque、list、set、map、queue、stack和string等。 Vector容器 Vector容器是C++ STL中最常用的容器之一,用于存储同类型的元素。Vector容器提供了多种构造函数...
在`ch03_Stack_Queue`这个压缩包中,包含了栈和队列的C++源代码实现。可能包含以下部分: 1. **栈的实现**: 可能使用`vector`作为基础,实现`push`、`pop`、`peek`和`isEmpty`方法。 2. **队列的实现**: 可能使用两...
3. **栈**:栈是一种后进先出(LIFO)的数据结构,C++标准库中的`stack`容器可以方便地实现栈的功能,如`push`、`pop`和`top`等操作。 4. **队列**:队列是一种先进先出(FIFO)的数据结构,C++中的`queue`容器提供...
- **适配器**:如stack、queue、priority_queue,将容器转换为特定数据结构。 - **智能指针**:如std::unique_ptr、std::shared_ptr和std::weak_ptr,用于安全地管理内存。 这份文档是C++开发者的重要参考资料,...
stack和queue虽然是容器,但它们是基于deque的容器适配器,而priority_queue则是基于heap实现的。array和forward_list是在C++11中引入的新容器类型。 std::array是固定大小的数组,底层实现为固定数组。定义时必须...
例如,stack和queue是基于deque的适配器,priority_queue是基于heap的适配器。侯捷会详细解析这些适配器的工作原理和使用方法。 6. **内存管理(Memory Management)**:STL容器通常使用智能指针(如auto_ptr、...
5. **容器**:STL中的容器如vector、list、deque、stack、queue和priority_queue等,它们提供了动态存储和管理数据的方式。每个容器都有其特定的使用场景和性能特点,例如,vector适合随机访问,而list适合频繁插入...
C++标准库还包括了基本类型转换(如`<charconv>`)、容器(如`<deque>`、`<forward_list>`、`<map>`、`<set>`、`<stack>`、`<queue>`、`<unordered_map>`、`<unordered_set>`等)、迭代器、智能指针(如`<memory>`中...