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
分享到:
相关推荐
第一章:构建可靠性、可扩展性、可维护性的应用 第二章:数据模型与查询语言 第三章:存储与检索 第四章:编码与演化 第五章:分布式数据 第六章:复制 第六章:分区 第七章:事务 第八章:分布式系统的麻烦 设计...
05_函数参数相关扩展 06_函数重载 07_函数重载和函数指针在一起 08_中午课程回顾 09_c++学习路线和c++基础课程学习标准_传智扫地僧 10_类的封装和访问控制 11_struct和class关键字区别 12_类的声明和类的实现分开 13...
6.8.7 扩展程序 275 6.8.8 提取子字符串 277 6.8.9 运行修改过的程序 279 6.9 C++/CLI编程 279 6.9.1 理解泛型函数 280 6.9.2 CLR版本的计算器程序 285 6.10 小结 290 6.11 练习 291 6.12 本章主要内容 292...
2.数据结构链表与合并表:树与图的存储栈与实例:单调、、单调栈kmp Trie并查集堆Hash表C ++ STL使用技巧 3.搜索与图论 DFS与BFS树与图的遍历:拓扑排序最短最小最小生成树 4.数学知识 质数约数欧拉函数快速幂扩展...
全书围绕c++语言的结构来组织,开始章节介绍编程的普通概念,接下来详细介绍C++hh的继承、多态、异常处理以及标准模板库(STL),同时还包含模式和uML的介绍。本书内容系统、全面,给出了大量代码示例、自测练习、编程...
栈与队列:单调队列、单调栈 kmp Trie 并查集 堆 Hash表 C++ STL使用技巧 搜索与图论 —— 代码模板链接 常用代码模板3——搜索与图论 DFS与BFS 树与图的遍历:拓扑排序 最短路 最小生成树 二分图:染色法、匈牙利...
3.5.4 字符数据在内存中的存储形式及使用方法 41 3.5.5 字符串常量 41 3.5.6 符号常量 42 3.6 变量赋初值 42 3.7 各类数值型数据之间的混合运算 43 3.8 算术运算符和算术表达式 44 3.8.1 C运算符简介 44 3.8.2 算术...
3.5.4 字符数据在内存中的存储形式及使用方法 41 3.5.5 字符串常量 41 3.5.6 符号常量 42 3.6 变量赋初值 42 3.7 各类数值型数据之间的混合运算 43 3.8 算术运算符和算术表达式 44 3.8.1 C运算符简介 44 3.8.2 算术...
4 STL 44 1) Vector.… 44 2]upper_ bound&lower_bound 45 mAp 45 数据结构 46 1.树. 146 1)基本知识 …46 2)几个问题 46 3)完全二叉树( Complete binary tree)… 54 4)次优查找树 55 5)...
2.3 扩展欧几里得算法(求 ax+by=gcd 的解以及逆元) . . . . . . . . . . . . . . . 27 2.4 求逆元 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.4.1 扩展欧几里德法 ...