`

数据结构C++实现---栈

 
阅读更多

1:利用C++ 实现Stack有两种有两种方案:

一是用链表 二是用数组。

#include <iostream> 
using namespace std; 
 
typedef int T; 
 
//链表类 
class LinkedList 
{ 
    struct Node 
    { 
        T data; 
        Node* next; 
        //初始化data next 阻止垃圾数据 
        Node(const T& t=T()):data(t),next(NULL) 
        { 
        } 
    }; 
public: 
    //构造  析构  清空 
    LinkedList():head(NULL) 
    { 
    } 
    ~LinkedList() 
    { 
        clear(); 
    } 
 
    void clear() 
    { 
        Node *p=head; 
        while (p!=NULL) 
        { 
            Node *q = p->next; 
            delete p;//释放p所在空间 
            p=q; 
        } 
    } 
    //判断empty 求size  遍历(travel) 
    bool empty() 
    { 
        //判断头指针是否为空 为空表示链表不存在 
        return head==NULL ? true : false; 
    } 
    unsigned int size() 
    { 
        unsigned int size=0; 
        Node* p =head; 
        while (p!=NULL) 
        { 
            size++; 
            p=p->next; 
        } 
        return size; 
    } 
 
    void travel() 
    { 
        //利用while循环一次次的输出来,直到指针为NULL结束 
        Node* p = head; 
        while (p!=NULL) 
        { 
            cout<<p->data<<endl; 
            p=p->next; 
        } 
    } 
    //增(insertAfter insertFront)删改查(find) 
    void insertFront(const T& t) 
    { 
        Node* p = new Node(t); 
        p->next=head;  //讲头指针所指向的地址给p的next 
        head = p;       //让*p作为头 
    } 
    void insertAfter(const T& t) 
    { 
        Node *p = new Node(t); 
        Node *tail = getPointer(size()-1); 
        tail->next = p; 
    } 
    void erase(const T& t) 
    { 
        unsigned int position = find(t); 
        Node* cur = getPointer(position); 
        if (position!=0) 
        { 
            Node* pre = getPointer(find(t)-1); 
            pre->next = cur->next; 
        }else{ 
            head = cur->next; 
        } 
        delete cur; 
    } 
    void update(const T& t,const T& target) 
    { 
        Node *p=getPointer(find(target)); 
        p->data=t; 
    } 
    unsigned int  find(const T& t) 
    { 
        unsigned int position=0; 
        Node* p = head; 
        while(p!=NULL) 
        { 
            if (p->data==t) 
            { 
                return position; 
            } 
            p=p->next; 
            position++; 
        } 
        return position; 
    } 
 
    //取头 取尾   
    T getHead() 
    { 
        return head->data; 
    } 
    T getTail() 
    { 
        Node *p=getPointer(this->size()-1); 
        return p->data; 
    } 
    //去指定位置取指针  辅助作用 
    Node* getPointer(int position) 
    { 
        Node* p =head; 
        for(int i = 0;i<position;i++) 
        { 
            p=p->next; 
        } 
        return p; 
    } 
private: 
    //头指针 最重要的部分 
    Node* head;  
}; 
 
class Stack 
{ 
public: 
    //构造器 析构器(和clear)压入 (push) 弹出pop 取出top 大小和非空empty 
    Stack() 
    { 
        list = new LinkedList; 
    } 
    ~Stack() 
    { 
        clear(); 
    } 
    void clear() 
    { 
        list->clear(); 
    } 
    void push(const T& t) 
    { 
        list->insertFront(t); 
    } 
    void pop() 
    { 
        list->erase(list->getHead()); 
    } 
    T top() 
    { 
        return list->getHead(); 
    } 
    unsigned int size() 
    { 
        return list->size(); 
    } 
    bool empty() 
    { 
        return list->empty(); 
    } 
 
private: 
    LinkedList* list; 
}; 
 
int main() 
{ 
    Stack s; 
    s.push(1); 
    s.push(2); 
    cout<<s.size()<<endl;  
    system("pause"); 
    return 0; 
} 
 

 

二:用数组实现 :

技巧:找到num和下标之间的关系,核心是num num控制着数组是增删改查的核心,元素,弹出就-1 ,添加后就+1

#include <iostream> 
#include <string> 
using namespace std; 
 
typedef string T; 
class Stack 
{ 
public: 
    Stack() 
    { 
        num=0; 
    } 
    ~Stack(){clear();} 
 
    //清空 
    void clear() 
    { 
        num=0; 
    } 
    //增删查 
    void push(const T& t) 
    { 
        /*arr[num]=t; 
        num++;合二为一*/ 
        arr[num++]=t; 
    } 
    void pop() 
    { 
        num--; 
    } 
    T top() 
    { 
        return arr[num-1]; 
    } 
    //大小长度 
    unsigned int size() 
    { 
        return num; 
    } 
    bool empty() 
    { 
        return num==0; 
    } 
private: 
    T arr[10]; 
    unsigned int num; 
}; 
 
分享到:
评论

相关推荐

    数据结构C++版--栈的实现及基本操作

    本主题聚焦于“数据结构C++版--栈的实现及基本操作”,我们将深入探讨栈这种特殊的数据结构以及如何用C++来实现它。 栈是一种线性数据结构,遵循“后进先出”(LIFO)的原则。这意味着最后插入的元素(称为顶元素...

    c++数据结构---链式栈

    本篇文章详细介绍了如何在VS2010环境下使用C++实现链式栈,包括数据结构的定义、链式栈的创建、入栈、出栈以及遍历操作的具体实现过程。链式栈因其动态分配的特点,在处理不确定大小的数据集合时具有明显优势。

    数据结构---链式栈的C++实现

    链式栈是一种特殊的数据结构,它属于线性数据结构,并且利用链表来实现栈的操作。本节将详细介绍如何用C++来实现链式栈。 首先,我们需要了解栈的基本概念。栈是一种后进先出(LIFO)的数据结构,常用于临时存储和...

    C++实现数据结构-栈

    C++实现数据结构-栈

    数据结构与C++--数据结构基础

    C++标准库提供了`std::stack`容器适配器,可以方便地实现栈操作。 4. **队列**:是先进先出(FIFO)的数据结构,类似于银行排队等候,先来的客户先服务。C++标准库中的`std::queue`容器适配器可以用于实现队列。 5...

    数据结构 C++实现 第2版习题答案 缪淮扣 沈俊版 有习题答案解析以及实验指导 ,请放心食用!

    本资料是《数据结构 C++实现 第2版》的习题答案及实验指导,由缪淮扣和沈俊编著。这份资源对学习者来说是一份宝贵的参考资料,可以帮助他们深入理解和应用所学的知识。 首先,关于数据结构的基本概念,主要包括数组...

    数据结构c++-源代码

    在这个"数据结构C++-源代码"的压缩包中,我们很可能会找到一系列用于实现各种数据结构的C++源代码。 1. **数组**:数组是最基本的数据结构,它是一个元素类型相同的集合,可以通过索引访问。在C++中,数组可以是一...

    数据结构C++ 朱战立---推荐

    在“数据结构C++ 朱战立”这个主题中,我们将会深入学习以下几个关键知识点: 1. **基本数据类型与数组**:C++中的基础数据类型包括整型、浮点型、字符型等,而数组则是这些元素的集合,它是最简单的一种数据结构,...

    C++ STL--数据结构与算法实现(余文溪)示例程序代码.rar

    C++ STL,全称为Standard Template Library(标准模板库),是C++编程语言中的一部分,它提供了丰富的容器、迭代器、算法和函数对象等组件,极大地简化了数据结构和算法的实现。余文溪的《C++ STL--数据结构与算法...

    数据结构 栈 链表实现 c++ 模板

    由于C++的链表操作比数组更灵活,它允许在运行时动态调整大小,因此非常适合实现栈这种数据结构。 栈在许多算法和程序设计问题中都有应用,如深度优先搜索、表达式求值、括号匹配等。使用链表和模板实现的栈,不仅...

    心希盼 c++ 数据结构 栈

    总之,这个压缩包提供的内容可能包括了一个C++实现的栈数据结构,通过分析和学习这个实现,你可以掌握如何在实际项目中应用栈,理解其内部工作原理,以及如何优化性能,比如通过动态扩容策略来减少不必要的内存开销...

    数据结构与算法--面向对象的C++设计

    本书不仅介绍了数据结构与算法的基本概念,还着重强调了面向对象编程范式(Object-Oriented Programming, OOP)在实际中的应用,特别是其在C++语言中的实现。 从给出的内容来看,本书至少包含了如下几个重要的知识...

    C++ 数据结构书籍 - 清华大学 - 邓俊辉 - 严蔚敏

    邓俊辉教授的《C++ 数据结构》注重理论与实践相结合,深入浅出地介绍了各种经典数据结构(如数组、链表、栈、队列、树、图等)的概念、特性以及在C++语言中的实现。书中不仅包含了详尽的代码示例,还有丰富的习题和...

    数据结构--栈--实现算法

    在C++中,我们可以使用数组或链表来实现栈。数组实现简单且效率高,但大小固定;链表实现则更灵活,可以动态扩展。 下面我们将以C++为例,讨论栈的两种常见实现: ### 数组实现 ```cpp #include class Stack { ...

    数据结构之栈——C++实现

    2. **C++实现栈的两种方式** - **使用STL中的stack**:STL的`&lt;stack&gt;`库提供了栈的数据结构,可以直接使用,无需手动管理内存。例如: ```cpp #include #include int main() { std::stack&lt;int&gt; s; s.push...

    数据结构C++版-二叉树实验-使用类模板的方式实现

    一、实验目的:1、实现二叉树的存储结构(二叉链表或三叉链表等存储结构任选)2、熟悉二叉树基本术语的含义3、掌握使用栈和队列及递归思想完成二叉树相关操作的编程实现二、实验内容: 主要完成以下功能:1....

    C++编程-数据结构与程序设计方法

    总之,"C++编程-数据结构与程序设计方法"这个主题涵盖了C++语言的核心要素,包括数据结构的实现和使用,以及面向对象编程和程序设计的最佳实践。掌握这些知识将使初学者能够编写出高效、可靠的软件,为进一步深入...

    数据结构算法集---C++语言实现

    C++模板类实现栈 在给定的部分内容中,作者使用了C++的模板类来实现一个通用的栈结构。通过模板机制可以实现类型参数化,使得栈能够存储任何类型的元素。 ```cpp template class StackNode { friend class Stack; ...

Global site tag (gtag.js) - Google Analytics