C++用数组和链表分别实现Stack

简介:

C++用数组和链表分别实现Stack

  C++学习有段时间了,感觉还是有很多不足啊,今天自己用数组和链表分别实现Stack,当然STL中的Stack肯定不是这么简单,你不妨看一下,说不定有收获呢,若发现有问题,请指正,毕竟对于C++我还是新手。

 

复制代码
// typename可以表示任何类型,而class只能表示类
template < typename T,typename container >
class  stack
{
public :
// 栈是否为空
bool  empty( )  const
{
return  index == 0 ;
}

// 出栈
void  pop( )
{
if (empty())
{
throw new  exception( " 栈中没有数据 " );
}
arr[index
- 1 ] = 0 ;
-- index;
}

// 出栈,如果默认数组未满继续添加数据,如果已满,重新分配一个两倍的数组,
// 把默认数组中的数据拷贝过来,释放默认数组,将指针指向新数组
void  push( const  T &  val)
{
if (index <= capacity - 1 )
{
arr[index
++ ] = val;
}
else
{
capacity
<<= 1 ; // capacity对应的二进制数左移一位
int * tmp = new int [capacity];
for ( int  i = 0 ;i < index;i ++ )
{
tmp[i]
= arr[i];
}
tmp[index
++ ] = val;
delete arr;
arr
= tmp;
}
}

// 栈中元素个数
int  size( )  const
{
return  index;
}

stack( ) 
{
// 默认栈中能存放4个元素,当然你会说这样不好,因为如果没有向栈中添加数据,却分配了四个元素的空间,显然不理想。
// 为了避免这个问题,可以在push方法的开始判断栈中是否有元素,如果没有元素,就开始分配空间,有元素当然就不用,
// 但是有个问题就是每次添加元素都要判断,如果添加元素较多的话,或许你会讨厌总要执行这多余的判断
// 缓式评估告诉我们,只有到万不得已的情况下才定义变量和分配空间,不然就可能是定义的多余变量和不需要分配的空间
// 但当某个变量是必须的,用缓式评估反而影响效率,因为为了实现缓式评估也是要代价的。
initialize( 4 );
}

// 预设栈能容纳cap个元素
stack( int  cap) 
{
initialize(cap);
}

// explicit防止出现类型转换
explicit  stack( const  container &  cont)

initialize(cont.size());
vector 
< int > ::const_iterator iter = cont.begin();
while (iter != cont.end())
{
push(
* iter ++ );
}
}

// 析构
~ stack()
{
delete arr;
}

// 输出栈顶元素
T &  top( )
{
return  arr[index - 1 ];
}

// 在C++中,可以重载const和non-const
const  T &  top( )  const
{
return  arr[index - 1 ];
}

private  :
int  capacity; // 容量
int  index; // 顶部元素的位置
* arr; // 数组

// 初始化
// 当然,初始化列表比赋值效率高,赋值多调用了一次constructor
void  initialize( int  cap)
{
capacity
= cap;
arr
= new  T[capacity];
index
= 0 ;
}
};
复制代码
复制代码
#include  < vector >
using namespace  std;
template
< typename T,typename container >
class  stack
{
public :
bool  empty( )  const
{
return  len == 0 ;
}

// 出栈
void  pop( )
{
if (empty( ))
{
throw new  exception( " 栈中没有数据 " );
}

if (head -> next == cur) // 删除第一个元素
{
delete cur;
head
-> next = NULL;
}
else // 删除最后一个元素
node  * tmp = head -> next;
// 将指针移到最后第二个元素
for ( int  i = 2 ;i < len;i ++ ) // 对比把for循环写成for(int i=0;i<len-2;i++)

tmp
= tmp -> next;
}
delete tmp
-> next;  // 析构最后一个元素
cur = tmp; // 将指针指到现在的最后一个元素

-- len; // 元素个数减一
}

// 出栈,如果默认数组未满继续添加数据,如果已满,重新分配一个两倍的数组,
// 把默认数组中的数据拷贝过来,释放默认数组,将指针指向新数组
void  push( const  T &  val)
{
node 
* tmp = new  node(val); // 新建节点
cur -> next = tmp; // 将当前节点的下一个节点指向新增节点
cur = tmp; // 当前节点指向新节点
++ len; // 节点个数加1
}

int  size( )  const
{
return  len;
}

stack( ) 
{
initialize();
}

// 析构
~ stack()
{
delete head;
}

explicit  stack( const  container &  cont)

initialize();
// cont.begin()是常量类型,所以这里只能用vector <int>::const_iterator而不能用vector <int>::iterator
vector  < int > ::const_iterator iter = cont.begin();
while (iter != cont.end())
{
push(
* iter);
iter
++ ;
}
}

T
&  top( )
{
return  cur -> val;
}

const  T &  top( )  const
{
return  cur -> val;
}

protected  :
typedef 
struct  node1
{
node1 
* next;
T val;
node1(T v):val(v),next(NULL){} 
}node;

private  :
int  len; // 元素个数
node  * head; // 表头节点
node  * cur; // 当前节点
void  initialize()
{
head
= new  node( - 1 );
cur
= head;
len
= 0 ;
}
};
复制代码

 

复制代码
class  stack
{
public :
bool  empty( )  const
{
return  index == 0 ;
}

// 出栈
void  pop( )
{
if (empty())
{
throw new  exception( " 栈中没有数据 " );
}
arr[index
- 1 ] = 0 ;
-- index;
}

// 出栈,如果默认数组未满继续添加数据,如果已满,重新分配一个两倍的数组,
// 把默认数组中的数据拷贝过来,释放默认数组,将指针指向新数组
void  push( const int &  val)
{
if (index <= capacity - 1 )
{
arr[index
++ ] = val;
}
else
{
capacity
<<= 1 ;
int * tmp = new int [capacity];
for ( int  i = 0 ;i < index;i ++ )
{
tmp[i]
= arr[i];
}
tmp[index
++ ] = val;
delete arr;
arr
= tmp;
}
}

int  size( )  const
{
return  index;
}

stack( ) 
{
initialize(
4 );
}

stack(
int  cap) 
{
initialize(cap);
}

// 析构
~ stack()
{
delete arr;
}

int &  top( )
{
return  arr[index - 1 ];
}

const int &  top( )  const
{
return  arr[index - 1 ];
}

private  :
int  capacity; // 容量
int  index; // 顶部元素的位置
int * arr; // 数组

// 初始化
// 当然,初始化列表比赋值效率高,赋值多调用了一次constructor
void  initialize( int  cap)
{
capacity
= cap;
arr
= new int [capacity];
index
= 0 ;
}
};
复制代码

作者:陈太汉


本文转自啊汉博客园博客,原文链接:http://www.cnblogs.com/hlxs/archive/2011/07/11/2103309.html

目录
相关文章
|
搜索推荐 编译器 C语言
【C++核心】特殊的元素集合-数组与字符串详解
这篇文章详细讲解了C++中数组和字符串的基本概念、操作和应用,包括一维数组、二维数组的定义和使用,以及C风格字符串和C++字符串类的对比。
330 5
|
9月前
|
设计模式 C++ 容器
c++中的Stack与Queue
c++中的Stack与Queue
|
9月前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
190 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
10月前
|
C++ 容器
【c++丨STL】stack和queue的使用及模拟实现
本文介绍了STL中的两个重要容器适配器:栈(stack)和队列(queue)。容器适配器是在已有容器基础上添加新特性或功能的结构,如栈基于顺序表或链表限制操作实现。文章详细讲解了stack和queue的主要成员函数(empty、size、top/front/back、push/pop、swap),并提供了使用示例和模拟实现代码。通过这些内容,读者可以更好地理解这两种数据结构的工作原理及其实现方法。最后,作者鼓励读者点赞支持。 总结:本文深入浅出地讲解了STL中stack和queue的使用方法及其模拟实现,帮助读者掌握这两种容器适配器的特性和应用场景。
267 21
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
431 64
|
10月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
490 5
|
10月前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
218 5
|
12月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
353 5
|
存储 算法 调度
【C++打怪之路Lv11】-- stack、queue和优先级队列
【C++打怪之路Lv11】-- stack、queue和优先级队列
176 1
|
设计模式 存储 C++
C++之stack 和 queue(下)
C++之stack 和 queue(下)
214 1