第93篇 C++数据结构(三)栈


栈的详细介绍网上有很多博文,在此不多做说明。

1.栈的简介

栈(stack)又名堆栈,作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。栈具有先进后出的特性。

1.1.入栈

也称为压栈,往栈里面添加新元素。

1.2.出栈

删除栈顶元素。

1.3.实现形式

(1)数组:数组实现的话栈的长度固定。
(2)链表:比较灵活。

2.节点

为了设计比较灵活,就写一个链表形式的栈,在此定义一个节点。

template <typename _dataType>
struct StackNode {
	using _stackNodePtr = StackNode<_dataType>*;

	_dataType m_value;
	_stackNodePtr m_next;

	StackNode() : m_value(_dataType()), m_next(nullptr) {}
	StackNode(_dataType value) : m_value(value), m_next(nullptr) {}
	StackNode(_dataType value, _stackNodePtr next) : m_value(value), m_next(next) {}
};

3.实现

3.1.变量

变量名类型属性说明
m_top_stackNodePtr私有栈顶
m_lensize_t私有数据个数

3.2.方法

方法名返回类型参数属性说明
Stack()--公有缺省构造
Stack()-const Stack& s公有拷贝构造
operator = ()Stack&const Stack& s公有=运算符重载
push()void_dataType value公有入栈
pop()void-公有出栈
top()_dataType&-公有栈顶访问
empty()bool-公有判断栈是否为空
size()size_t-公有栈里面数据个数

4.测试

4.1.测试代码

#include <iostream>

#include "Stack.h"

void stackTest()
{
	std::cout << "\n构造:" << std::endl;
	Stack<int> s;

	std::cout << "\n数据个数:" << s.size() << std::endl;

	std::cout << "\nempty:" << std::endl;
	if (s.empty()) {
		std::cout << "s is empty!" << std::endl;
	}
	else {
		std::cout << "s isn't empty!" << std::endl;
	}

	std::cout << "\npush(7)" << std::endl;
	s.push(7);
	std::cout << "\n数据个数:" << s.size() << std::endl;
	std::cout << "top = " << s.top() << std::endl;

	std::cout << "\npush:1,2,3,4,5,6" << std::endl;
	int num = 1;
	while (num < 7) {
		s.push(num++);
	}
	std::cout << "\n数据个数:" << s.size() << std::endl;
	std::cout << "top = " << s.top() << std::endl;

	Stack<int> st = s;
	while (!st.empty()) {
		std::cout << st.top() << ", ";
		st.pop();
	}

	std::cout << "\nempty:" << std::endl;
	if (s.empty()) {
		std::cout << "s is empty!" << std::endl;
	}
	else {
		std::cout << "s isn't empty!" << std::endl;
	}

	std::cout << "\npop" << std::endl;
	s.pop();
	std::cout << "\n数据个数:" << s.size() << std::endl;
	std::cout << "top = " << s.top() << std::endl;

	std::cout << "\n清空栈:" << std::endl;
	while (!s.empty()) {
		s.pop();
	}

	std::cout << "\n数据个数:" << s.size() << std::endl;
	std::cout << "\nempty:" << std::endl;
	if (s.empty()) {
		std::cout << "s is empty!" << std::endl;
	}
	else {
		std::cout << "s isn't empty!" << std::endl;
	}
}

4.2.输出结果

构造:

数据个数:0

empty:
s is empty!

push(7)

数据个数:1
top = 7

push:1,2,3,4,5,6

数据个数:7
top = 6
6, 5, 4, 3, 2, 1, 7,
empty:
s isn't empty!

pop

数据个数:6
top = 5

清空栈:

数据个数:0

empty:
s is empty!

5.实现代码

#pragma once
#ifndef _STACK_H_
#define _STACK_H_

#include <cassert>

template <typename _dataType>
struct StackNode {
	using _stackNodePtr = StackNode<_dataType>*;

	_dataType m_value;
	_stackNodePtr m_next;

	StackNode() : m_value(_dataType()), m_next(nullptr) {}
	StackNode(_dataType value) : m_value(value), m_next(nullptr) {}
	StackNode(_dataType value, _stackNodePtr next) : m_value(value), m_next(next) {}
};

template <typename _dataType>
class Stack
{
	using _stackNodePtr = StackNode<_dataType>*;
public:
	Stack() : m_top(nullptr), m_len(0) {}

	Stack(const Stack& s)
	{
		if (s.m_top) {
			m_top = new StackNode<_dataType>(s.m_top->m_value);
			_stackNodePtr top = m_top;
			_stackNodePtr stop = s.m_top->m_next;
			while (stop) {
				top->m_next = new StackNode<_dataType>(stop->m_value);
				top = top->m_next;
				stop = stop->m_next;
			}

			m_len = s.m_len;
		}
		else {
			m_top = nullptr;
			m_len = 0;
		}
	}

	~Stack()
	{
		while (this->m_top) {
			this->pop();
		}
	}

	Stack& operator = (const Stack& s)
	{
		while (this->m_top) {
			this->pop();
		}

		if (s.m_top) {
			m_top = new StackNode<_dataType>(s.m_top->m_value);
			_stackNodePtr top = m_top;
			_stackNodePtr stop = s.m_top->m_next;
			while (stop) {
				top->m_next = new StackNode<_dataType>(stop->m_value);
				top = top->m_next;
				stop = stop->m_next;
			}

			m_len = s.m_len;
		}
		else {
			m_top = nullptr;
			m_len = 0;
		}

		return *this;
	}

	void push(_dataType value)
	{
		m_top = new StackNode<_dataType>(value, m_top);
		m_len++;
	}

	void pop()
	{
		assert(m_top);

		_stackNodePtr top = m_top;
		m_top = m_top->m_next;

		delete top;
		top = nullptr;

		m_len--;
	}

	_dataType& top()
	{
		assert(m_top);

		return m_top->m_value;
	}

	bool empty()
	{
		return m_top == nullptr;
	}

	size_t size() const
	{
		return m_len;
	}

private:
	_stackNodePtr m_top;
	size_t m_len;
};

#endif // !_STACK_H_


6.总结

只在实现,不在解释说明。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大唐不良猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值