C++详解实现Stack方法

目录
  • 栈简介
  • stack模拟
  • 示例代码
    • 开发环境
    • 运行结果

栈简介

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

stack模拟

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

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

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

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

模拟实现

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

#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

#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

#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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C/C++中栈(stack)&堆(heap)详解及其作用介绍

    目录 概述 程序运行中的栈和堆 堆和栈的差异 申请方式和回收方式 申请后系统的响应 申请效率比较 申请大小的限制 堆和栈中的存储内容 概述 栈 (stack) 是为执行线程流出的内存空间. 堆 (head) 是为动态分配预留的空间. 程序运行中的栈和堆 我们以一段代码来举例: #include <iostream> using namespace std; int a = 0; // 全局初始化区 char *pt; // 全局未初始化 int main() { int b; // b在栈区

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

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

  • C++栈(stack)的模板类实现代码

    本文实例为大家分享了C++栈(stack)的模板类实现代码,供大家参考,具体内容如下 1.基本概念 栈中的元素遵守"先进后出"的原则(LIFO,Last In First Out) 只能在栈顶进行插入和删除操作 压栈(或推入.进栈)即push,将数据放入栈顶并将栈顶指针加一 出栈(或弹出)即pop,将数据从栈顶删除并将栈顶指针减一 栈的基本操作有:pop,push,判断空,获取栈顶元素,求栈大小 2.构造栈 可以使用数组构造栈,也可以使用单向链表构造,我觉得使用单向链表更加灵活方便,下

  • C++详解实现Stack方法

    目录 栈简介 stack模拟 示例代码 开发环境 运行结果 栈简介 栈本着先进后出的原则,来存取数据.作为数据结构中的一种,这里不多介绍相关栈.仅以此文记录C++中栈的实现,可帮助提升编程能力与对栈的理解. stack模拟 stack是一种容器适配器,专门在具有后进先出的上下文环境中,其删除只能是在一端进行操作. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出 .

  • mysql 5.7.20解压版安装方法步骤详解(两种方法)

    我来讲解下window64位下MySQL的安装,MySQL是在5.7开始安装版就只有32位下载服务了,这里我讲解解压版的MySQL如何安装,在安装MySQL解压版时对于新手的小编来说也是头疼得很,各种问题各种来没有安装版的一键轻松搞定的方便,安装时需要注意三点:1.路径配置,2.安装时MySQL端口被占用这时需要关闭被占用端口,3.cmd必须是在管理员环境下设置MySQL信息. MySQL官网: https://www.mysql.com/downloads/ http://www.jb51.n

  • Android AsyncTask详解及使用方法

     Android AsyncTask详解及使用方法  简介: AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务. AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 一.如果想自定义一个AsyncTask,可以写一个类,继承AsyncTask. eg: . //第一个参数为doInBackground中传入的类型,第二个为

  • 详解Struts2动态方法调用

    动态方法就是一个Action对应多个请求,减少Action的数量 1.指定method属性 <action name="addAction" method="add" class="com.venn.action.HelloWorldAction"> <result>/jsp/add.jsp</result> </action> 2.感叹号(!)方式(不推荐使用) <action name=&

  • 详解Python import方法引入模块的实例

    详解Python import方法引入模块的实例 在Python用import或者from-import或者from-import-as-来导入相应的模块,作用和使用方法与C语言的include头文件类似.其实就是引入某些成熟的函数库和成熟的方法,避免重复造轮子,提高开发速度. python的import方法可以引入系统的模块,也可以引入我们自己写好的共用模块,这点和PHP非常相似,但是它们的具体细节还不是很一样.因为php是在引入的时候指明引入文件的具体路径,而python中不能够写文件路径进

  • IOS中Json解析实例方法详解(四种方法)

    作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此"http://www.bejson.com/"网站来进行JSON格式化校验(点击打开链接).此网站不仅可以检测Json代码中的错误,而且可以以视图形式显示json中的数据内容,很是方便. 从IOS5开始,APPLE提供了对json的原生支持(NSJSONSerialization),但是为了兼容以前的iOS版本,可以使用第三方库来解析Json. 本文将介绍Tou

  • 详解C#扩展方法原理及其使用

    1.写在前面 今天群里一个小伙伴问了这样一个问题,扩展方法与实例方法的执行顺序是什么样子的,谁先谁后(这个问题会在文章结尾回答).所以写了这边文章,力图从原理角度解释扩展方法及其使用. 以下为主要内容: 什么是扩展方法 扩展方法原理及自定义扩展方法 扩展方法的使用及其注意事项 2.什么是扩展方法 一般而言,扩展方法为现有类型添加新的方法(从面向对象的角度来说,是为现有对象添加新的行为)而无需修改原有类型,这是一种无侵入而且非常安全的方式.扩展方法是静态的,它的使用和其他实例方法几乎没有什么区别.

  • 详解Java中NullPointerException异常的原因详解以及解决方法

    NullPointerException是当您尝试使用指向内存中空位置的引用(null)时发生的异常,就好像它引用了一个对象一样. 当我们声明引用变量(即对象)时,实际上是在创建指向对象的指针.考虑以下代码,您可以在其中声明基本类型的整型变量x: int x; x = 10; 在此示例中,变量x是一个整型变量,Java将为您初始化为0.当您在第二行中将其分配给10时,值10将被写入x指向的内存中. 但是,当您尝试声明引用类型时会发生不同的事情.请使用以下代码: Integer num; num

  • 详解MyBatis-Plus updateById方法更新不了空字符串/null解决方法

    最近遇到了Mybatis-Plus updateById(),更新某一个字段为null,却发现没有更新成功,发现有一个博客记录挺好的.转载过来,方便自己看. 一.简介 因为最近在忙项目,好久都没有更新博客,最近在项目中刚好遇到一个问题,就是在使用MyBatis-Plus updateById(xxx)的时候,居然更新不了字符串或者null,本文分享两种解决方案,具体大家可以根据自己的需求选择一种方法解决. 二.原理 在实际项目中,难免更新的时候,有可能会把已有的值更新成空字符串或者null,但是

  • 详解Java中方法next()和nextLine()的区别与易错点

    1.基本语法 1.1基本使用方法 本篇博客重点nextLine()会读取换行('\r'),但是不会进行输出. Java中Scanner类中的方法next()和nextLine()都是吸取输入台输入的字符,区别: next()不会吸取字符前/后的空格/Tab键,只吸取字符,开始吸取字符(字符前后不算)直到遇到空格/Tab键/回车截止吸取: nextLine()吸取字符前后的空格/Tab键,回车键截止. 输入两行字符串: 我爱学JAVA 我真的很爱爱学JAVA 我真的很爱很爱学JAVA 期望输出结果

随机推荐