资讯专栏INFORMATION COLUMN

【数据结构】栈的实现——顺序栈和链栈

RyanQ / 3368人阅读

摘要:一栈的定义定义限定只在表的一端表尾进行插入和删除的线性表特点后进先出二顺序栈基于数组实现实现代码头文件栈的最大存储定义一个顺序栈类使用模板使用模板优点可以用来实现多种数据类型的存储数据域栈的大小栈顶

一、栈的定义

定义:限定只在表的一端(表尾)进行插入和删除的线性表

特点:后进先出

二、顺序栈

基于数组实现

C++实现代码:

//头文件#ifndef STACK_H_INCLUDED#define STACK_H_INCLUDED//栈的最大存储const int MAX_SIZE=100;//定义一个顺序栈类(使用模板) //使用模板 优点 可以用来实现多种数据类型的存储template <class DataType> class Stack{private:    DataType *data; //数据域    int size;       //栈的大小    int top;		//栈顶下标public:    Stack();    Stack(int s);    //~Stack();    void push(DataType t);  //进栈    DataType pop();         //出栈 返回栈顶元素    DataType getTop();       //返回栈顶元素 不出栈    int length();           //求出栈的长度    void setNull();         //将栈置空    class Empty{};          //定义空类 用于抛异常    class Full{};    bool isFull();          //判断栈是否已满    bool isEmpty();         //判断栈是否为空};typedef Stack<char> CharStack;typedef Stack<int> IntStack;#endif // STACK_H_INCLUDED
//.cpp文件#include "Stack.h"//无参构造 栈的大小为最大存储template <class DataType> Stack<DataType>::Stack(){    size=MAX_SIZE;    top=-1;    data=new DataType[MAX_SIZE];}//有参构造 栈的大小给定template <class DataType> Stack<DataType>::Stack(int s){    size=s;    top=-1;    data=new DataType[size];}template <class DataType> bool Stack<DataType>::isFull(){    if(top+1==size){        return true;    }else{        return false;    }}template <class DataType> bool Stack<DataType>::isEmpty(){    if(top==-1){        return true;    }else{        return false;    }}//压栈 先判断栈是否已满 然后将top++template <class DataType> void Stack<DataType>::push(DataType e){    if(isFull()){        throw Stack<DataType>::Full();    }else{        data[++top]=e;    }}//弹出 先判断栈是否为空 然后top--template <class DataType> DataType Stack<DataType>::pop(){    if(isEmpty()){        throw Stack<DataType>::Empty();    }else{        return data[top--];    }}//得到栈顶元素 不弹出template <class DataType> DataType Stack<DataType>::getTop(){    if(isEmpty()){        throw Stack<DataType>::Empty();    }else{        return data[top];    }}//栈的长度template <class DataType> int Stack<DataType>::length(){    return top+1;}//将栈清空template <class DataType> void Stack<DataType>::setNull(){    top=-1;}template class Stack<char>;template class Stack<int>;
//主函数#include #include "Stack.h"#include "Sta.cpp"using namespace std;//顺序栈int main(){    CharStack charStack;    IntStack intStack(3);    try{    intStack.push(2);    intStack.push(60);    intStack.push(100);    cout<<"栈的长度:"<<intStack.length()<<endl;    }catch(IntStack::Full){      cout<<"STACK FULL!"<<endl;    }    try{    intStack.pop();    }catch(IntStack::Empty){      cout<<"STACK EMPTY!"<<endl;    }    cout<<"栈的长度:"<<intStack.length()<<endl;    return 0;}

三、链栈

基于链表实现(不带头节点)

#ifndef LINKSTACK_H_INCLUDED#define LINKSTACK_H_INCLUDEDtemplate <typename DataType>struct Node{    DataType data; //数据域    Node<DataType> *next;  //指针域};template <typename DataType>class LinkStack{private:        Node<DataType> *top; //栈顶指针public:    LinkStack();    ~LinkStack();    void push(DataType x);    DataType pop();    DataType getTop();    bool isEmpty();    bool isFull();};typedef LinkStack<char> CharLinkStack;typedef LinkStack<int> IntLinkStack;#endif // LINKSTACK_H_INCLUDED
#include "LinkStack.h"//构造函数 创建top指针template <class DataType> LinkStack<DataType>::LinkStack(){    top=NULL;}//析构函数 释放资源template <class DataType>LinkStack<DataType>::~LinkStack(){    Node<DataType> *p=NULL;    while(top!=NULL){        p=top->next;        delete top;        top=p;    }}//判断链栈是否为空template <class DataType> bool LinkStack<DataType>::isEmpty(){        if(top==NULL){            return true;        }else{            return false;        }}/*template  bool LinkeStack::isFull(){}*///压入元素template <class DataType> void LinkStack<DataType>::push(DataType x){            Node<DataType> *s=new Node<DataType>; //新定义一个Node结点指针            s->data=x;            s->next=top;      //将结点的指针域指向栈顶top(即压入了一个新的元素)            top=s;             //再让top指向结点        }//弹出栈顶元素template <class DataType> DataType LinkStack<DataType>::pop(){        if(isEmpty()){            throw "链栈为空,无法弹出元素";        }else{            DataType x=top->data;            Node<DataType> *p=new Node<DataType>;            p=top;      //将栈顶指针先赋给p            top=top->next;  //栈顶指针指向栈顶的下一个存储空间(即栈顶元素弹出)            delete p;       //销毁p的空间            return x;        }}//返回栈顶元素template <class DataType> DataType LinkStack<DataType>::getTop(){           return top->data;}template class LinkStack<char>;template class LinkStack<int>;
#include #include "LinkStack.cpp"using namespace std;//链栈int main(){    IntLinkStack intLinkStack;    intLinkStack.push(20);    intLinkStack.push(15);    cout<<"栈顶元素:"<<intLinkStack.getTop()<<endl;    intLinkStack.pop();    cout<<"栈顶元素:"<<intLinkStack.getTop()<<endl;    return 0;}

注意:

  • C++分文件编写时需要在   .h中尾部加入代码,相当于为每个类型的模板定义了一个类型
typedef Stack<char> CharStack;
  • .cpp文件中尾部加入代码,显示的声明要使用的模板类实例
 template class Stack<char>;
  • main 函数中实例化类对象
CharStack charStack;
  • 利用模板实现,每个类的方法前都要加上
template <class DataType>

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/119972.html

相关文章

  • 算法学习之数据结构线性表、堆、栈

    摘要:栈底是固定的,而栈顶浮动的如果栈中元素个数为零则被称为空栈。入栈将数据保存到栈顶。链栈链栈是指栈的链式存储结构,是没有附加头节点的运算受限的单链表,栈顶指针是链表的头指针。 一、喜欢单挑线性表 1.线性表的特性 线性表是一个线性结构,它是一个含有n≥0个节点的有限序列。在节点中,有且仅有一个开始节点没有前驱并有一个后继节点,有且仅有一个终端节点没有后继并有一个前驱节点。其他的节点都有且...

    huaixiaoz 评论0 收藏0
  • 链栈实现简易四则运算计算器(php版)

    摘要:下面我们用栈来实现简易的四则运算计算器。列一下本文的思路实现链栈的数据结构及其操作中缀表达式转后缀表达式后缀表达式求值首先先实现一个链栈。是否是四则运算符号计算后缀表达式的值为空则跳过最后,我们测试一下所实现的计算器。 栈是一种限定仅在表尾进行插入和删除操作的线性表。栈的应用有很多,比如常见的递归,计算机表达式求值等。下面我们用栈来实现简易的四则运算计算器。 列一下本文的思路: 实现...

    solocoder 评论0 收藏0
  • js数据结构和算法(二)栈和队列

    摘要:对于栈来说,这个表尾称为栈的栈顶,相应的表头称为栈底。栈和队列的区别栈的插入和删除操作都是在一端进行的,而队列的操作却是在两端进行的。出栈操作出栈操作就是在栈顶取出数据,栈顶指针随之下移的操作。 基本概念 栈和队列都是动态的集合,在栈中,可以去掉的元素是最近插入的哪一个。栈实现了后进先出。在队列中,可以去掉的元素总是在集合中存在的时间最长的那一个。队列实现了先进先出的策略。 栈的官...

    jsummer 评论0 收藏0
  • 【译】JavaScript数据结构(2):栈与队列

    摘要:栈和队列是开发中最常用的两种数据结构。如果又有数据入栈,的值将增加到。如果一个数据从栈中被取出,的值将会减少为。队列与栈类似,队列也是一个线性数据结构。与栈不同的是,队列只删除最先添加的数据。现在,让我们将栈大小的实现应用到队列中。 翻译:疯狂的技术宅英文:https://code.tutsplus.com/art...说明:本文翻译自系列文章《Data Structures With...

    zlyBear 评论0 收藏0
  • 队列和 BFS —— 栈和 DFS

    摘要:队列和广度优先搜索的一个常见应用是找出从根结点到目标结点的最短路径。然后在每一轮中,我们逐个处理已经在队列中的结点,并将所有邻居添加到队列中。这就是我们在中使用队列的原因。 队列和 BFS: 广度优先搜索(BFS)的一个常见应用是找出从根结点到目标结点的最短路径。 示例 这里我们提供一个示例来说明如何使用 BFS 来找出根结点 A 和目标结点 G 之间的最短路径。 showImg(h...

    Kyxy 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<