笔记六:基于数组的栈的实现

定义:后进先出的数据结构

实现一:基于数组表示的线性表的派生栈的实现。

原理:把线性表的插入和删除操作限制在同一端进行,即得到栈的表现形式。

操作:把数组线性表的右端定义为栈顶。

代码:

template<typename T>
class stack
{
public:
    virtual ~stack() {};
    virtual bool empty() const = 0;
    virtual int size() const = 0;
    virtual T& top() = 0;
    virtual void pop() = 0;
    virtual void push(const T& theElement) = 0;
};

template<typename T>
class derivedArrayStack : private arrayList<T>, public stack<T>
{
public:
    derivedArrayStack(int initialCapacity = 10) : arrayList<T>(initialCapacity) {}
    bool empty() const { return arrayList<T>::empty(); }
    int size() const { return arrayList<T>::size(); }
    T& top() {
         if (arrayList<T>::size() - 1 < 0)
         {
             cout << "当前栈为空栈!" << endl;
             exit(-1);
         }
        return arrayList<T>::get(arrayList<T>::size() - 1);
    }
    void pop() {
        if (arrayList<T>::size() - 1 < 0)
        {
            cout << "当前栈为空栈,不能进行删除操作!" << endl;
            exit(-1);
        }
        arrayList<T>::erase(arrayList<T>::size() - 1); }
    void push(const T& theElement) { arrayList<T>::insert(arrayList<T>::size(), theElement); }
};

实现二:不以arrayList作为基类,直接实现数组型栈

操作:定义一个指向栈顶的标记stackTop,栈容量标记stackLength和存储数组元素的指针。

代码:

template<typename T>
class arrayStack : public stack<T>
{
public:
    arrayStack(int initialCapacity = 10);
    ~arrayStack() { delete[] stk; }
    bool empty() const { return stackTop == -1; }
    int size() const { return stackTop + 1; }
    T& top();
    void pop();
    void push(const T& theElement);
private:
    int stackTop;   //当前栈顶
    int arrayLength;    //栈容量
    T*  stk;        //元素数组
};

template<typename T>  arrayStack<T>::arrayStack(int initialCapacity)
{
    stackTop = -1;
    arrayLength = initialCapacity;
    stk = new T[arrayLength];
}

template<typename T> T& arrayStack<T>::top()
{
    if (stackTop == -1)
    {
        cout << "当前栈为空栈!" << endl;
        exit(-1);
    }

    return stk[stackTop];
}

template<typename T> void arrayStack<T>::pop()
{
    if (stackTop == -1)
    {
        cout << "当前栈为空栈!" << endl;
        return ;
    }

    //T* curr = stk[stackTop];
    int delTop = stackTop;
    --stackTop;
    stk[delTop].~T();
}

template<typename T> void arrayStack<T>::push(const T& theElement)
{
    if (stackTop == arrayLength - 1)    //达到栈容量,增加栈容量
    {
        T *tmp = new T[arrayLength * 2];
        copy(stk, stk + stackTop, tmp);
        stk = tmp;
        arrayLength = arrayLength * 2;
    }
    stk[++stackTop] = theElement;

}

main()函数:

int main(int argc, char *argv[])
{
    derivedArrayStack<int> DAS;
    DAS.push(5);
    cout << "将元素5入栈后,栈的大小:" << DAS.size() << endl;

    DAS.push(4);
    cout << "将元素4入栈后,栈的大小:" << DAS.size() << endl;

    cout << "返回栈顶元素:" << DAS.top() << "  size = "<<DAS.size()<<endl;

    DAS.pop();
    cout << "删除栈顶元素后新的栈顶元素为:" << DAS.top() << "  size =  " << DAS.size() << endl;

    cout << "\n**********************\n" << endl;

    arrayStack<int> AS;
    AS.push(5);
    cout << "将元素5入栈后,栈的大小:" << " size: "<<AS.size() << endl;

    AS.push(4);
    cout << "将元素4入栈后,栈的大小:" << AS.size() << endl;

    cout << "返回栈顶元素:" << AS.top() << "  size = " << AS.size() << endl;

    AS.pop();
    cout << "删除栈顶元素后新的栈顶元素为:" << AS.top() << "  size =  " << AS.size() << endl;

    return 0;
}

运行:

时间: 2024-11-13 09:39:15

笔记六:基于数组的栈的实现的相关文章

基于数组的栈(Java)

package com.rao.linkList; /** * @author Srao * @className ArrayStack * @date 2019/12/3 13:41 * @package com.rao.linkList * @Description 基于数组的栈 */ public class ArrayStack { private String[] items; //栈中的数据 private int count; //当前栈中元素的个数 private int n;

lucene学习笔记二(基于数组的lucene检索,索引删除)

构建数组: private String[] ids = {"1","2","3","4","5","6"}; private String[] emails = {"[email protected]","[email protected]","[email protected]","[email protected

java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个 PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比我的描述要复杂 得多,这里我只是简单的一句带过,因为这

【读书笔记】C#高级编程 第六章 数组

(一)同一类型和不同类型的多个对象 如果需要使用同一类型的多个对象,就可以使用数组或集合(后面章讲). 如果需要使用不同类型的多个对象,可以使用Tuple(元组)类型. (二)简单数组 如果需要使用同一类型的多个对象,可以使用数组.数组是一种结构,它可以包含同一类型的多个元素. 1.数组的声明 在声明数组时,应先定义数组总元素的类型,其后是一堆空方括号和一个变量名. 例子: 以下代码声明了一个包含整形类型的数组 int[] intArray; 2.数组的初始化 声明了数组后,就必须为数组分配内存

语法》第六章 数组

(本文为阮一峰js标准教程的学习笔记,旨在总结该教程中涉及的知识点大纲及个人所做的一些拓展,方便作为"目录"或者"大纲"复习和查漏补缺,详细内容请参见阮一峰教程原文) 第二部分 语法 *********第六章 数组*********** 一.数组的定义1.概念:按次序排列的一组数,每个值都有编号(从0开始)整个数组用[]表示2.可以定义时赋值,也可定以后赋值.arr[0]='a';3.任何数据类型都可放入数组,[1,'1',[1,2],{},function(){}

JavaScript基础笔记:对象和数组

对象是一种类型,即引用类型.而对象的值就是引用类型的实例.在ECMAScirpt中引用类型是一种数据类型,用于将数据和功能组织在一起.常被称为类.但ECMAScript并没有这种东西.ECMAScirpt是一种面向对象的语言,却不具备传统面向对象语言所支持的类和接口等基本结构. 一.Object类型 创建Object类型有两种方式.一种是使用new运算符,一种是字面量表示法. 1.使用new运算符创建Object 1 var box = new Object(); // new 方式 2 box

基于数组实现Java 自定义Queue队列及应用

Java 自定义队列Queue: 队列的抽象数据类型就是一个容器,其中的对象排成一个序列,我们只能访问和取出排在最前端( Front)的对象,只能在队列的尾部( Rear)插入新对象.正是按照这一规则,才能保证最先被插入的对象首先被删除( FIFO).java本身是有自带Queue类包,为了达到学习目的已经更好深入了解Queue队列,自己动手自建java Queue类是个很好的学习开始: 基于数组的实现 ? 顺序数组 借助一个定长数组 Q 来存放对象,即可简单地实现队列.那么,为了符合 FIFO

嵌入式Linux学习笔记(基于S5PV210 TQ210)

基于S5PV210.TQ210平台. 本文更多的是教会大家如何学习! 包括如下内容: 1.前言 2.开发环境搭建 3.制作交叉编译器 4.裸机编程 4.1.汇编学习 4.2.S5PV210启动流程 4.3.点亮一个LED 4.4.串口 4.5.实现printf 4.6.时钟配置 4.7.重定位 4.8.DDR 4.9.NAND读写 4.11.LCD操作 5.移植u-boot(基于u-boot-2014.4版本) 5.1.概述 5.2.u-boot配置过程分析 5.3.u-boot编译过程分析 5

Lua学习笔记(六):函数-续

Lua中的函数是带有词法定界(lexical scoping)的第一类值(first-class values).第一类值指:在Lua中函数和其他值(数值.字符串)一样,函数可以被存放在变量中,也可以存放在表中,可以作为函数的参数,还可以作为函数的返回值.词法定界指:嵌套的函数可以访问他外部函数中的变量.这一特性给Lua提供了强大的编程能力. Lua中关于函数稍微难以理解的是函数也可以没有名字,匿名的.当我们提到函数名(比如print),实际上是说一个指向函数的变量,像持有其他类型的变量一样: