C++标准模版库中的栈模版类提供了一些方法可以对栈进行简单的操作,其中提供的方法如下:
bool empty( ) const;
查看栈是否为空,如果为空返回true,否则返回false。
void pop( );
弹出位于栈顶的对象,栈中的对象个数减一。不返回任何值。
void push(const Type& _Val);
将Type类型的值_Val压进栈,栈中的对象个数加一。不返回任何值。
size_type size( ) const;
返回栈的大小,即栈中对象的个数。其中size_type是一个unsigned size类型。
value_type& top( );
const value_type& top( ) const;
返回位于栈顶的对象,不修改栈中的对象。
大家可以看到,标准库中栈类提供的方法很有限,而且不能限定栈的大小,而且在对空栈进行pop操作时因没有采取防范措施会导致应用程序崩溃,这是很不安全的,因此在扩展栈模版类时我会在构造函数中指定栈中能够盛放最大对象个数。通过参考java类库,为方便对栈的操作,可以为栈添加如RemoveAll()、ElementAt()等方法。重新定义的方法如下:
bool Push(T i);
如果栈未满,即栈中的对象个数小于栈的大小,则将对象i压进栈,并返回true;如果栈已满,不执行任何操作,返回false。其中T为i的数据类型,下同。
T Pop();
如果栈为非空,弹出位于栈顶的对象,栈中的对象个数减一。返回弹出的对象。
T Peek();
如果栈为非空,返回位于栈顶的对象,不修改栈中的对象。其功能和原来stack的top()方法相同。
void RemoveAll();
弹出栈中所有的对象,即将栈清空。
bool IsEmpty();
查看栈是否为空,如果为空返回true,否则返回false。其功能和原来stack的empty()方法相同。
T ElementAt(int i);
返回位于栈中第i个对象,此对象的位置从栈底算起。
unsigned int Size();
返回栈的大小,即栈中对象的个数。
bool SetMaxSize(unsigned int mSize);
如果当前栈中对象的个数设置栈的大小,即设置栈能够盛放的最大对象的个数,并返回true。否则返回false。
基于以上提供的栈方法,我使用了断言(assert)来判断当前操作的合法性,如不能对空栈执行pop操作,如果进行pop操作则产生一个异常(是abnormal,它与exception不同,abnormal的产生是由assert后的布尔表达式为假产生的,并不是运行时的错误)。扩展后的栈模版类的代码如下:
//*********Stack.h***********
//*******Code: hifrog********
#include<stack>
#include<assert.h>
using namespace std;
template<typename T>
class Stack
{
private:
stack<T> s;
unsigned int MaxSize;
public:
Stack(unsigned int mSize)
{
MaxSize=mSize;
}
bool Push(T i)
{
if(Size()<MaxSize)
{
s.push(i);
return true;
}
return false;
}
T Pop()
{
T tmp=0;
assert(!s.empty());
tmp=s.top();
s.pop();
return tmp;
}
T Peek()
{
assert(!s.empty());
return s.top();
}
void RemoveAll()
{
while(!s.empty())
s.pop();
}
bool IsEmpty()
{
return s.empty();
}
T ElementAt(int i)
{
assert(i>0&&i<=Size());
int tmp=(int)s.size();
T value=0;
stack<T> tmpS;//这里使用了一个临时栈保存从s栈中弹出的元素
//用来获得位置为i的元素的值
for(int k=tmp;k>i;k--)
{
tmpS.push(s.top());
assert(!s.empty());
s.pop();
}
assert(!s.empty());
value=s.top();
for(int j=tmp;j>i;j--)
//向s栈回填弹出的元素
{
s.push(tmpS.top());
assert(!s.empty());
tmpS.pop();
}
return value;
}
unsigned int Size()
{
return (unsigned int)s.size();
}
bool SetMaxSize(unsigned int mSize)
{
if(mSize>Size())
{
MaxSize=mSize;
return true;
}
return false;
}
};
而且写了一个测试程序:
#include "Stack.h"
//#include<string>
#include<iostream>
using namespace std;
int main()
{
double db_array[]=
{
1.1,2.2,3.3,4.4,5.5
};
Stack<double> db_stack(10);
int i=0;
while(i<5)
{
db_stack.Push(db_array[i]);
i++;
}
cout<<db_stack.Size()<<endl;
cout<<db_stack.ElementAt(2)<<endl;
while(!db_stack.IsEmpty())
{
cout<<db_stack.Pop()<<endl;
}
//db_stack.Pop();
return 0;
}
运行结果如下:
5
2.2
5.5
4.4
3.3
2.2
1.1
分享到:
相关推荐
5. **适配器(Adapter)**:适配器用于修改或扩展已有的容器、迭代器或算法的功能,比如stack和queue是对deque的适配,提供了栈和队列的操作。 6. **空间配置器(Allocator)**:空间配置器负责内存的分配和释放,为...
STL中的库函数可以分为几大类:容器(Container)、算法(Algorithm)和迭代器(Iterator)。 容器(Container) 容器是STL中的一种基本数据结构,用于存储和管理数据。常用的容器有: * vector<T>:大小可变的...
4. 配接器:这些是修改或扩展现有容器行为的工具,例如`stack`将`deque`或`vector`转换为后进先出(LIFO)的栈,`queue`则将容器转换为先进先出(FIFO)的队列。 在《C++ STL使用教程》中,读者可以期待了解到如何...
VC6.0 STL Pack是指专门为Microsoft Visual C++ 6.0这个古老的开发环境设计的一套STL实现和扩展。在Visual C++ 6.0的时代,STL并不是默认支持的,因此需要额外安装STL Pack来获取完整的功能。 STL的核心概念包括: ...
STL(Standard Template Library,标准模板库)是C++编程中不可或缺的一部分,它提供了一组高效、可重用的数据结构和算法。这个压缩包“SGI-STL-.rar_STL_sgi stl”包含了SGI(Silicon Graphics, Inc.)版本的STL...
相比STL,OBJ文件更适合于复杂的3D建模和渲染,因为它提供了更清晰的数据结构和更灵活的扩展性。 从STL转换为OBJ的过程通常包括以下步骤: 1. 读取STL文件:解析文件中的每个三角形,提取顶点坐标和法线信息。 2. ...
C++ STL,全称为Standard Template Library(标准模板库),是C++编程语言中不可或缺的一部分,它为程序员提供了高效且灵活的编程工具。STL的核心概念包括泛型编程、容器、迭代器、算法和函数对象,这些组件共同构成...
- STL的精髓在于泛型编程,它允许开发者编写与特定类型无关的代码,提高了代码的复用性和可扩展性。 - 通过模板实现,STL容器和算法可以用于任意满足特定要求的类型,如具有复制构造函数和赋值操作符的类型。 7. ...
由于提供的文件内容无法实际查看...通过阅读STL中文版,学习者可以了解到如何在实际编程中有效利用STL的组件,以及如何根据需要对STL进行扩展。在深入理解STL的基础上,C++程序员能够写出更加高效、可读性更强的代码。
其中,包括了对容器、迭代器、算法和函数对象的最佳实践,如正确理解和使用迭代器失效,何时选择栈、队列或关联容器,以及如何有效地利用STL的算法来优化代码性能。这本书还强调了STL模板特化的概念,以及如何利用...
C++标准模板库(STL)是C++编程语言中的一个重要组成部分,它提供了一组高效、可重用的容器、迭代器、算法和函数对象,大大简化了数据结构和算法的实现。STL手册通常会详细阐述这些组件的使用方法,提供实例代码,...
- 探索STL的扩展:如Boost库中的高级容器和算法,或者C++11及更高版本引入的新特性,如emplace、move语义等。 - 理解STL的内存管理:包括迭代器失效的原因、容器的动态扩容策略等。 通过阅读《美河提供.STL.源码...
1. 容器:STL提供了多种类型的容器,如向量(vector)、列表(list)、集合(set)、映射(map)、队列(queue)、栈(stack)等。它们各自有不同的特性和用途,例如,向量是一个动态数组,支持随机访问;列表则是一...
6. **智能指针**:虽然STL本身不包含智能指针,但SGI STL版本可能包含一些扩展,如`auto_ptr`,它是早期的智能指针,自动管理对象生命周期,防止内存泄漏。 7. **内存管理**:STL容器内部使用了高效的内存管理策略...
STL,全称为Standard Template Library,是C++标准库的核心组成部分,...通过理解STL的基本概念和组件,开发者能够更有效地构建高效且易于扩展的C++程序。学习和熟练掌握STL对于任何C++开发者来说都是一项重要的技能。
10. **STL的扩展和自定义**:用户可以创建自己的容器、迭代器、算法和函数对象来扩展STL,以满足特定需求。Meyers提供了关于如何正确设计和实现这些自定义组件的指导。 总的来说,《Effective STL》是一本深入解析...
STL,全称为Standard Template Library(标准模板库),是C++编程语言中不可或缺的一部分,它提供了高效、可重用的数据结构和算法。STL的主要目标是简化编程,提高代码的可读性和性能。通过三十分钟的学习,我们可以...
STL的引入是计算机科学中抽象思想的一次重大进展,从面向过程到面向对象再到泛型编程,每一步都旨在解决不同规模和复杂性的程序设计问题。 在STL中,迭代器(Iterator)扮演着关键角色。迭代器是一种抽象接口,它...
数据结构与STL是计算机科学中的重要组成部分,特别是在软件开发和算法设计中起着核心作用。数据结构是指在计算机中组织和存储数据的方式,而STL(Standard Template Library,标准模板库)是C++编程语言中的一组通用...