C++Stack栈类模版实例详解

目录
  • 1.栈的介绍
  • 2.栈实现
  • 3.代码测试
  • 总结

1.栈的介绍

栈的实现方式分为3

  • 基于静态数组实现,内部预设一个很大的数组对象, 实现简单,缺点是空间受限。
  • 基于动态数组实现,内部预设一个容量值,然后分配一段内存空间数组,如果入栈大于默认容量值时,则再次扩大分配新的内存数组,并将旧数组拷贝至新数组及释放旧数组.
  • 基于双向循环链表实现

栈的函数需要实现如下所示:

  • T pop() : 出栈并返回栈顶元素
  • void  push(const T &t) : 入栈
  • const T & top() const : 获取const类型栈顶元素
  • T &top() : 获取栈顶元素
  • int length() const: 获取数量(父类已经实现)void clear(): 清空栈(父类已经实现)

本章,我们实现的栈基于动态数组实现,它的父类是我们之前实现的Vector类:

C++ 动态数组模版类Vector实例详解

所以代码实现会非常简单.

2.栈实现

代码如下所示:

#ifndef Stack_H
#define Stack_H
#include "throw.h"
// throw.h里面定义了一个ThrowException抛异常的宏,如下所示:
//#include <iostream>
//using namespace std;
//#define ThrowException(errMsg)  {cout<<__FILE__<<" LINE"<<__LINE__<<": "<<errMsg<<endl; (throw errMsg);}
#include "Vector.h"
template<class T>
class Stack : public Vector<T>
{
public:
    T pop()
    {
        if(Vector<T>::isEmpty()) {        // 如果栈为空,则抛异常
            ThrowException("Stack is empty ...");
        }
        T t = Vector<T>::data()[Vector<T>::length() - 1];
        Vector<T>::resize(Vector<T>::length() - 1);
        return  t;
    }
    // 入栈,实际就是append尾部添加成员
    void push(const T &t)
    {
        Vector<T>::append(t);
    }
    T &top()
    {
        if(Vector<T>::isEmpty()) {
            ThrowException("Stack is empty ...");
        }
        return Vector<T>::data()[Vector<T>::length() - 1];
    }
    const T &top() const
    {
        if(Vector<T>::isEmpty()) {
            ThrowException("Stack is empty ...");
        }
        return Vector<T>::data()[Vector<T>::length() - 1];
    }
};
#endif // Stack_H

3.代码测试

int main(int argc, char *argv[])
{
    Stack<int> stack;
    cout<<"******* current length:"<<stack.length()<<endl;
    for(int i = 0; i < 5; i++) {
        cout<<"stack.push:"<<i<<endl;
        stack.push(i);
    }
    cout<<"******* current length:"<<stack.length()<<endl;
    while(!stack.isEmpty()) {
        cout<<"stack.pop:"<<stack.pop()<<endl;
    }
    return 0;
}

运行打印:

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C++ 动态数组模版类Vector实例详解

    目录 1.实现机制 2.代码实现 3.测试运行 总结 1.实现机制 内部主要通过m_capacity数组容量成员和m_length数组有效长度成员来维护一个T* data数组空间. 内部默认分配一定数量大小的数组指针,每次append尾部追加的时候,无需再次分配空间,直接赋值标志length长度,假如超过当前空间容量,则再次扩大分配新的内存数组,并将旧数组拷贝至新数组及释放旧数组. Vector需要实现的public函数如下所示: inline int capacity() : 获取容量 inl

  • C++ Queue队列类模版实例详解

    目录 1.队列的介绍 2.代码实现 3.测试运行 总结 1.队列的介绍 队列的定义 队列(Queue)是一种线性存储结构.它有以下几个特点: 按照"先进先出(FIFO, First-In-First-Out)"方式进出队列. 队列只允许在"队首"进行取出操作(出队列),在"队尾"进行插入操作(入队列 ) 队列实现的方式有两种 基于动态数组实现 基于链表形式实现 队列需要实现的函数 T dequeue() : 出队列,并返回取出的元素 void e

  • C++ 双向循环链表类模版实例详解

    目录 1.插入某个节点流程 2.构造函数修改 3.重新实现append和prepend函数 4.修改迭代器类 5.LinkedList.h代码如下 6.测试运行 总结 在上章C++图解单向链表类模板和iterator迭代器类模版详解 我们学习了单链表,所以本章来学习双向循环链表 我们在上个文章代码上进行修改, 由于双向循环链表在我们之前学的单链表上相对于较为复杂,所以需要注意的细节如下所示. 1.插入某个节点流程 如下图所示: 对应代码如下所示: /*插入一个新的节点*/ bool insert

  • C++中十种内部排序算法的比较分析

    C++中十种内部排序算法的比较分析 #include<iostream> #include<ctime> #include<fstream> using namespace std; #define MAXSIZE 1000 //可排序表的最大长度 #define SORTNUM 10 //测试10中排序方法 #define max 100 //基数排序时数据的最大位数不超过百位: typedef struct node { int data3; int next; }

  • C++图解单向链表类模板和iterator迭代器类模版详解

    目录 1.链表介绍 1.1单链表插入某个节点流程 1.2单链表删除某个节点流程 1.3单链表清除所有节点流程 2.实现单链表 2.1indexOf()函数示例如下所示: 3.实现一个迭代器来优化链表遍历 3.1为什么要实现一个迭代器? 总结 链表用来构建许多其它数据结构,如堆栈,队列和他们的派生. 对于非线性的链表,可以参见相关的其他数据结构,例如二叉树.图等. 1.链表介绍 常见的线性链表分为三种 单链表: 每个结点都含有指向其后继结点的地址信息 双向链表: 每个结点都有指向其前驱结点和后继结

  • C++对象排序的比较你了解吗

    目录 1.对象比较介绍 2.代码实现 总结 1.对象比较介绍 在排序中进行交换的前提主要是进行对象间的 比较. 而常见的排序是对一个数组排序,然后对每个数组内容进行比较与交换. 如果是对一个class进行排序,则需要进行关键字成员进行比较,需要重写下面几个操作符: bool operator == (const class& t);        // 返回ture则表示相等 bool operator != (const class& t);        // 和==相等操作符返回值相

  • C++Stack栈类模版实例详解

    目录 1.栈的介绍 2.栈实现 3.代码测试 总结 1.栈的介绍 栈的实现方式分为3种 基于静态数组实现,内部预设一个很大的数组对象, 实现简单,缺点是空间受限. 基于动态数组实现,内部预设一个容量值,然后分配一段内存空间数组,如果入栈大于默认容量值时,则再次扩大分配新的内存数组,并将旧数组拷贝至新数组及释放旧数组. 基于双向循环链表实现 栈的函数需要实现如下所示: T pop() : 出栈并返回栈顶元素 void  push(const T &t) : 入栈 const T & top(

  • 数据结构 栈的操作实例详解

    数据结构 栈的操作实例详解 说明: 往前学习数据结构,想运行一个完整的顺序栈的程序都运行不了,因为书上给的都是一部分一部分的算法,并没有提供一个完整可运行的程序,听了实验课,自己折腾了一下,总算可以写一个比较完整的顺序栈操作的小程序,对于栈也慢慢开始有了感觉.下面我会把整个程序拆开来做说明,只要把这些代码放在一个文件中,用编译器就可以直接编译运行了. 一.实现 1.程序功能 关于栈操作的经典程序,首当要提及进制数转换的问题,利用栈的操作,就可以十分快速地完成数的进制转换. 2.预定义.头文件导入

  • Java自定义异常类的实例详解

    Java自定义异常类的实例详解 为什么要自己编写异常类?假如jdk里面没有提供的异常,我们就要自己写.我们常用的类ArithmeticException,NullPointerException,NegativeArraySizeException,ArrayIndexoutofBoundsException,SecurityException这些类,都是继续着RuntimeException这个父类,而这个父类还有一个父类是Exception.那么我们自己写异常类的时候,也是继续Excepti

  • Java 中DateUtils日期工具类的实例详解

    Java 中DateUtils日期工具类的实例详解 介绍 在java中队日期类型的处理并不方便,通常都需要借助java.text.SimpleDateFormat类来实现日期类型 和字符串类型之间的转换,但是在jdk1.8之后有所改善,jdk1.7以及之前的版本处理日期类型并不方便, 可以借助Joda Time组件来处理,尤其是日期类型的一些数学操作就更是不方便. java代码 /** * * 日期工具类 java对日期的操作一直都很不理想,直到jdk1.8之后才有了本质的改变. * 如果使用的

  • C# Random类随机函数实例详解

    目录 引言 一.创建界面 二.效果展示 三.Random类方法 四.代码逻辑 总结: 引言 Random类是非常值得学习的一个类,所以我们今天一起学习一下Random这个类,对于模拟数据这个是随机类可是一个好东西,我们可以用这个随机函数模拟我们想要的数据,从而实现数据模拟,为了更好的学习随机数Random,我们做一个随机挑选饭菜的随机选择器,为了更好的学习,创作不易,点赞关注评论收藏!!!你的点赞是我学习的动力,你点赞是我创作的方向. 一.创建界面 我们平时有选择恐惧症的,每天的人生难题就是今天

  • Python文件操作类操作实例详解

    本文讲述了Python文件操作类的操作实例,详细代码如下: #!/usr/bin/env python #!/usr/bin/env python #coding:utf-8 # Purpose: 文件操作类 #声明一个字符串文本 poem=''' Programming is fun测试 When the work is done if you wanna make your work also fun: use Python! ''' #创建一个file类的实例,模式可以为:只读模式('r'

  • java中Calendar类用法实例详解

    本文实例讲述了java中Calendar类用法.分享给大家供大家参考,具体如下: java中的Calendar在开发中经常被忽略,这篇博客总结一下这个类,对后面项目中使用时期的时候有帮助. Calendar常量(field)的作用 Calendar cal = Calendar.getInstance(); cal.get(Calendar.DATE);//-----------------------当天 1-31 cal.get(Calendar.DAY_OF_MONTH);//------

随机推荐