服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++详解实现Stack方法

C++详解实现Stack方法

2023-02-14 15:26肩上风骋 C/C++

C++ Stack(堆栈)是一个容器类的改编,为程序员提供了堆栈的全部功能,也就是说实现了一个先进后出(FILO)的数据结构

栈简介

栈本着先进后出的原则,来存取数据。作为数据结构中的一种,这里不多介绍相关栈。仅以此文记录C++中栈的实现,可帮助提升编程能力与对栈的理解。

stack模拟

stack是一种容器适配器,专门在具有后进先出的上下文环境中,其删除只能是在一端进行操作。

stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出 。

stack的底层原理可以是任何标椎的容器类模板或者一些特定的容器类,这些容器类应该支持以下操作:

  • empty:判空操作。
  • back:尾部元素获取。
  • push_back:尾部插入元素操作
  • pop_back:尾部删除元素操作。

模拟实现

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
template<class T, class Con = deque<T>>
    class stack
    {
    public:
        stack();
        void push(const T& x)
        {
            _c.push_back(x);
        }
        void pop()
        {
            _c.pop_back();
        }
        T& top()
        {
            return _c.back()
        }
        const T& top()const
        {
            return _c.back();
        }
        size_t size()const
        {
            return _c.size();
        }
        bool empty()const
        {
            return _c.empty();
        }
    private:
        Con _c;
    };

示例代码

直接上代码。

SeqStack.h

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#pragma once
#define MAX_SIZE 1024
#define TRUE 1
#define FALSE 0
typedef struct SEQSTACK {
    void *data[MAX_SIZE];
    int size;
}SeqStack;
class MySeqStack
{
public:
    MySeqStack();
    ~MySeqStack();
    void init();
    void pushStack(void *data);
    void * getTopStack();
    void popStack();
    int isEmpty();
    int getSizeStack();
    void clearStack();
private:
    SeqStack *m_stack;
};

SeqStack.cpp

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include "SeqStack.h"
#include <iostream>
using namespace std;
MySeqStack::MySeqStack()
{
}
MySeqStack::~MySeqStack()
{
    if (m_stack != nullptr)
    {
        delete m_stack;
        m_stack = nullptr;
    }
}
void MySeqStack::init()
{
    m_stack = new SeqStack;
    if (m_stack == nullptr)
    {
        cout << "分配内存为空" << endl;
    }
    else
    {
        m_stack->size = 0;
        for (int i = 0; i < m_stack->size; ++i)
        {
            m_stack->data[i] = nullptr;
        }
    }
}
void MySeqStack::pushStack(void * data)
{
    if (m_stack->size == MAX_SIZE)
    {
        return;
    }
    if (m_stack == nullptr)
    {
        return;
    }
    if (data == nullptr)
    {
        return;
    }
    m_stack->data[m_stack->size] = data;
    m_stack->size++;
}
void * MySeqStack::getTopStack()
{
    if (m_stack == nullptr)
    {
        return nullptr;
    }
    if (m_stack->size == 0)
    {
        return nullptr;
    }
    return m_stack->data[m_stack->size-1];
}
void MySeqStack::popStack()
{
    if (m_stack == nullptr)
    {
        return ;
    }
    if (m_stack->size == 0)
    {
        return ;
    }
    m_stack->data[m_stack->size - 1] = nullptr;
    m_stack->size--;
}
int MySeqStack::isEmpty()
{
    if (m_stack == nullptr)
    {
        return -1;
    }
    if (m_stack->size == 0)
    {
        return TRUE;
    }
    return FALSE;
}
int MySeqStack::getSizeStack()
{
    return m_stack->size;
}
void MySeqStack::clearStack()
{
    if (m_stack == nullptr)
    {
        return ;
    }
    for (int i = 0; i < m_stack->size; ++i)
    {
        m_stack->data[i] = nullptr;
    }
    m_stack->size = 0;
}

main.cpp

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include "SeqStack.h"
using namespace std;
typedef struct PERSON {
    char name[64];
    int age;
    int score;
}Person;
void test()
{
    MySeqStack *stack = new MySeqStack;
    stack->init();
    Person p1 = { "hudf",3,56 };
    Person p2 = { "akso",4,67 };
    Person p3 = {"及家属的",6,88};
    Person p4 = { "口袋",7,98 };
    Person p5 = { "husdh",8,34 };
    stack->pushStack(&p1);
    stack->pushStack(&p2);
    stack->pushStack(&p3);
    stack->pushStack(&p4);
    stack->pushStack(&p5);
    while (stack->getSizeStack() > 0)
    {
        Person *data = (Person*)stack->getTopStack();
        cout << "name = " << data->name << " age= " << data->age << " score=" << data->score << endl;
        stack->popStack();
    }
    delete stack;
    stack = nullptr;
}
int main()
{
    test();
    return 0;
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门使用技巧:
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

开发环境

vs2017控制台输出程序。

运行结果

C++详解实现Stack方法

到此这篇关于C++详解实现Stack方法的文章就介绍到这了,更多相关C++ Stack内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/blqzj214817/article/details/125339014

延伸 · 阅读

精彩推荐
  • C/C++解析C++类内存分布

    解析C++类内存分布

    本篇文章介绍了C++类内存分布结构,我们来看看编译器是怎么处理类成员内存分布的,特别是在继承、虚函数存在的情况下...

    lsgxeva9782021-11-14
  • C/C++C++函数指针详解

    C++函数指针详解

    这篇文章主要介绍了C++函数指针详解,通过文字描述C++函数指针基础概念,内涵详细的代码实现和解析,希望对你能够有所帮助...

    途径北海道7502021-11-18
  • C/C++浅谈C++变量作用域

    浅谈C++变量作用域

    这篇文章主要介绍了C++变量作用域的的相关资料,文中代码非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...

    菜鸟教程5082021-09-13
  • C/C++详解C语言中的常量指针和指针常量

    详解C语言中的常量指针和指针常量

    这篇文章主要介绍了详解C语言中的常量指针和指针常量,包括其之间的区别是C语言入门学习中的基础知识,需要的朋友可以参考下...

    zinss269147822021-03-05
  • C/C++一文搞懂C++多态的用法

    一文搞懂C++多态的用法

    C++多态是在继承的基础上实现的,了解多态之前我们需要掌握一定的C++继承的知识,本文将介绍C++中多态的概念,构成条件以及用法,感兴趣的可以学习一...

    卖寂寞的小男孩6642022-11-15
  • C/C++C语言修炼之路初识分支句 循环助本心上篇

    C语言修炼之路初识分支句 循环助本心上篇

    现实生活中我们经常需要根据不同的条件做出不同的选择。程序设计中也需要根据条件来选择不同的程序进行处理,这称之为分支结构,当条件表达式不存...

    玄澈_7002022-10-12
  • C/C++数据结构顺序表操作示例

    数据结构顺序表操作示例

    这篇文章主要介绍了数据结构顺序表操作示例,其中有在第I个元素前插入数据x,元素从0开始计数、删除第i个元素,元素从0开始计数的方法,需要的朋友可以...

    C语言程序设计4822021-01-17
  • C/C++基于重启后消失的注册表键值的详细介绍

    基于重启后消失的注册表键值的详细介绍

    本篇文章是对重启后消失的注册表键值进行了详细的分析介绍,需要的朋友参考下...

    C语言教程网2632020-12-02