IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 第93篇 C++数据结构(三)栈 -> 正文阅读

[数据结构与算法]第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.总结

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

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 12:01:52  更:2022-04-26 12:05:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:19:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码