C++实现一个简单的链表栈

C++实现一个简单的链表栈

/**---------------------------------------
* 文件名称: CLinkStack.h
* 功能描述: 链表栈实现
* 创建标识: xad 2022/2/9
*
* 修改标识:
* 修改描述:
------------------------------------------**/

#ifndef CLINKSTACK_LINKSTACK_H
#define CLINKSTACK_LINKSTACK_H

namespace Algo03
{
	// 链式栈的结点
	typedef struct LINKNODE {
		struct LINKNODE* _pNext;
	}LinkNode;


	class ClinkStack
	{
	private:
		LinkNode	_pHead;		//头节点
		int			_nSize;		//栈结点个数
	public:
		ClinkStack();
		~ClinkStack();

		/**
		*  @brief    入栈
		*
		*  @param    LinkNode * data
		*  @return   void
		*/
		void push_linkStack(LinkNode* data);

		/**
		*  @brief    出栈
		*
		*  @return   void
		*/
		void pop_linkStack();

		/**
		*  @brief    返回栈顶元素
		*
		*  @return   Algo03::LinkNode*
		*/
		LinkNode* top_linkStack() const;

		/**
		*  @brief    返回栈元素个数
		*
		*  @return   int
		*/
		int get_size()const;

		/**
		*  @brief    清空栈
		*
		*  @return   void
		*/
		void clear_linkStack();
	};

}

#endif
#include "CLinkStack.h"
#include <iostream>

using namespace Algo03;

const int MATH_ZERO = 0;

Algo03::ClinkStack::ClinkStack()
{
	_pHead._pNext = nullptr;
	_nSize = 0;
}

Algo03::ClinkStack::~ClinkStack()
{
	//没有内存不需要释放
	std::cout << "free CLinkStack" << std::endl;
}

void Algo03::ClinkStack::push_linkStack(LinkNode * data)
{
	if (data == nullptr)
	{
		return;
	}

	data->_pNext = _pHead._pNext;
	_pHead._pNext = data;
	++_nSize;
}

void Algo03::ClinkStack::pop_linkStack()
{
	if (_nSize == MATH_ZERO)
	{
		return;
	}

	auto* pCurrent = _pHead._pNext;
	_pHead._pNext = pCurrent->_pNext;
	--_nSize;
}

LinkNode * Algo03::ClinkStack::top_linkStack() const
{
	if (_nSize == MATH_ZERO)
	{
		return nullptr;
	}

	return _pHead._pNext;
}

int Algo03::ClinkStack::get_size() const
{
	return _nSize;
}

void Algo03::ClinkStack::clear_linkStack()
{
	if (_nSize == 0)
	{
		return;
	}

	_pHead._pNext = nullptr;
	_nSize = 0;
}

#include <iostream>
#include "CLinkStack.h"

using namespace std;
using namespace Algo03;

void test_04(void);

typedef struct PERSON {
	LinkNode node;
	char name[64];
	int age;
}Person;

int main()
{
	test_04();
	system("pause");
	return 0;
}

void test_04()
{
	// 创建栈
	Algo03::ClinkStack stack;

	// 创建数据
	Person p1, p2, p3, p4, p5;
	strcpy_s(p1.name, "aaa");
	strcpy_s(p2.name, "bbb");
	strcpy_s(p3.name, "ccc");
	strcpy_s(p4.name, "ddd");
	strcpy_s(p5.name, "eee");

	p1.age = 10;
	p2.age = 20;
	p3.age = 30;
	p4.age = 40;
	p5.age = 50;

	// 入栈
	stack.push_linkStack((LinkNode*)&p1);
	stack.push_linkStack((LinkNode*)&p2);
	stack.push_linkStack((LinkNode*)&p3);
	stack.push_linkStack((LinkNode*)&p4);
	stack.push_linkStack((LinkNode*)&p5);

	while (stack.get_size() > 0) {
		// 取出栈顶元素
		auto *p = (Person *)stack.top_linkStack();
		std::cout << "Name:" << p->name << " Age:" << p->age << std::endl;
		// 弹出栈顶元素
		stack.pop_linkStack();
	}

	// 自动析构,销毁stack

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++链表实现可以使用链表来模拟的结构。在这种实现中,我们可以使用std::list来作为底层数据结构。\[1\]的结构可以定义为一个类,其中包含一个std::list<int>类型的成员变量stk来存储中的元素。此外,我们可以使用两个迭代器bottom和top来表示底和顶。 入操作可以通过在链表的头部插入元素来实现。具体而言,我们可以使用std::list的push_front()函数将元素插入到链表的头部。在入操作中,我们需要将新元素插入到顶位置,并更新顶指针top。 下面是一个简单C++代码示例,展示了如何使用链表实现的入操作: ```cpp void Stack::push(int value) { stk.push_front(value); top = stk.begin(); } ``` 在这个示例中,我们使用std::list的push_front()函数将新元素插入到链表的头部,然后将top指针更新为链表的第一个元素。 需要注意的是,由于链表没有固定的大小限制,因此在链表实现中不会出现满的情况。\[1\]因此,我们可以根据需要随时向链表中添加新的元素。 希望这个回答能够帮助到你! #### 引用[.reference_title] - *1* [C++实现链表模拟)【每一步详细深入讲解,代码清晰、简单、易懂】](https://blog.csdn.net/weixin_55755506/article/details/128356314)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值