上一节用连续的方式实现栈,这种方法用一个确定大小的数组存储栈元素,因为当存储达到数组上限时会遇到麻烦。

连续实现的栈与链式实现的栈的最大不同在于,前者使用一个确定大小的数组存储每一个栈元素,后者使用带指针的自定义结构(Node)来存储栈元素,因此可以在后期持续增加栈元素。

链式栈的栈元素存储于自定义的数据结构--Node中,每一个Node均包含两个属性,一个是它里面的元素(栈元素),一个是指向它下一个Node的指针。由此,一个Node包含着栈元素,同时它指向着下一个Node,以此类推,构成一种链式实现的栈。最后,要用顶部指针(指向第一个Node的指针)作为该栈的寻址头。

另外,在这个链式栈的实现当中还实现了几个有用的成员函数--析构函数与重载赋值运算。

代码:

Node.h文件:

/*
 * Node.h
 *
 *  Created on: 2015年8月27日
 *      Author: Lv_Lang
 */

#ifndef NODE_H_
#define NODE_H_

#include "stdio.h"

typedef int Stack_entry;
typedef Stack_entry Node_entry;

struct Node
{
	//	data members
	Node_entry entry; // 存放的元素
	Node *next;		  // 指向下一个元素的指针
	//	Constructors
	Node();
	Node(Node_entry item, Node *add_on = NULL);
};

#endif /* NODE_H_ */

Node.cpp文件:

/*
 * Node.cpp
 *
 *  Created on: 2015年8月27日
 *      Author: Lv_Lang
 */

#include "Node.h"

Node::Node()
{
	next = NULL;
}
Node::Node(Node_entry item, Node *add_on)
{
	entry = item;
	next = add_on;
}

Stack.h文件:

/*
 * Stack
 *
 *  Created on: 2015年8月21日
 *      Author: Administrator
 */

#ifndef STACK
#define STACK

#include "Node.h"

const int maxstack = 10;
enum Error_code {overflow, underflow, success};

class Stack
{
public:
	Stack();
	bool empty()const;
	Error_code pop();
	Error_code top(Stack_entry &item)const;//察看顶部元素,item作为取出值的载体
	Error_code push(const Stack_entry &item);// item是放入的值
	// Safety features for linked structures
	~Stack();
	Stack(const Stack &original);
	void operator = (const Stack &original);
protected:
	Node *top_node;
};

#endif /* STACK_ */

Stack.cpp文件:

/*
 * Stack.cpp
 *
 *  Created on: 2015年8月21日
 *      Author: Administrator
 */
#include "Stack.h"

Stack::Stack()
{
	top_node = NULL;
}
bool Stack::empty()const
{
	if(top_node == NULL)
		return true;
	else
		return false;
}
Error_code Stack::pop()
{
	if(empty())
			return underflow;
	else
	{
		//只需新建一个指针,无须新建空间故不用new
		Node *old_top = top_node;
		top_node = old_top->next;
		delete old_top; //记得要delete掉被删除指针指向的空间
		return success;
	}
}
Error_code Stack::top(Stack_entry &item)const
{
	if(empty())
		return underflow;
	else
		item = top_node->entry;
	return success;
}
Error_code Stack::push(const Stack_entry &item)
{
	//需要先new出一块区域
	Node *new_top = new Node(item,top_node); //new语句返回的是指针
	if(new_top== NULL)
		return overflow;
	else
	{
		top_node = new_top;
		return success;
	}
}
Stack::~Stack()
{
	while(!empty())
	{
		pop();
	}
}
void Stack::operator =(const Stack &original)
{
	Node *new_top, *new_copy, *original_node = original.top_node;
	if(original.top_node == NULL)
		new_top = NULL;
	else
	{
		new_top = new_copy = new Node(original_node->entry);
		while(original_node->next != NULL)
		{
			original_node = original_node->next;
			new_copy->next = new Node(original_node->entry);
			new_copy = new_copy->next;
		}
	}
	while(!empty())	//Clean out old Stack entries
		pop();
	top_node = new_top;	// and replace them with new entries
}
Stack::Stack(const Stack &original)
{
	Node *new_copy, *original_node = original.top_node;
	if(original.top_node == NULL)
		top_node = NULL;
	else
	{			// Duplicate(copy) the linked nodes
		top_node = new_copy = new Node(original_node->entry);
		while(original_node->next != NULL)
		{
			original_node = original_node->next;
			new_copy->next = new Node(original_node->entry);
			new_copy = new_copy->next;
		}
	}
}

main函数测试文件:

/*
 * main.cpp
 *
 *  Created on: 2015年8月21日
 *      Author: Administrator
 */
#include "Stack.h"
//using

void test_1();
void test_2();

int main()
{
	Stack mystack;
	bool e = mystack.empty();
	mystack.push(2);
	e = mystack.empty();
	mystack.push(5);
	int a;
	mystack.top(a);
	printf("%s %d\n","Hello",a);

	Stack stack_1(mystack);
	int b;
	stack_1.top(b);
	printf("%s %d\n","Hello1",b);

	Stack stack_2;
	stack_2 = mystack;
	int c;
	stack_2.top(c);
	printf("%s %d\n","Hello2",c);

	return 0;
}

main函数测试文件写的比较粗糙,这里只要测试能成功实现栈的重载赋值操作即可。

C++数据结构之Linked Stack(链式栈)的更多相关文章

  1. [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)

    再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个 ...

  2. 数据结构学习笔记——stack实现(数组篇)

    一 栈:是一种表,限制插入和删除只能在一个位置,也即是表的末端(也是栈的顶)进行. 基本操作:push 和 pop. 二 栈的数组实现: 运用数组来存储元素,和栈操作先关的是theArray(一个数组 ...

  3. Python数据结构应用1——Stack

    Reference: Problem Solving with Algorithms and Data Structures, Release 3.0 自学一下数据结构,学完之后刷leetcode,使 ...

  4. 线性数据结构之栈——Stack

    Linear data structures linear structures can be thought of as having two ends, whose items are order ...

  5. redis数据结构存储Linked List设计细节(redis的设计与实现笔记)

    redis里拥有一个灵活扩展且获取表头表尾复杂度为O(1)的双端列表,分为list和listNode2部分组成. list: typedef struct list {//链表 listNode *h ...

  6. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现

      本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是 ...

  7. java数据结构与算法之栈(Stack)设计与实现

    本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是一种用于 ...

  8. 数据结构:二级指针与Stack的数组实现

    [简介] Stack,栈结构,即传统的LIFO,后进先出,常用的实现方法有数组法和链表法两种.如果看过我上一篇文章<数据结构:二级指针与不含表头的单链表>,一定会看到其中的关键在于,利用v ...

  9. 数据结构栈的java实现

    近来复习数据结构,自己动手实现了栈.栈是一种限制插入和删除只能在一个位置上的表.最基本的操作是进栈和出栈,因此,又被叫作“先进后出”表. 实现方式是这样的:首先定义了一个接口,然后通过这个接口实现了线 ...

随机推荐

  1. 基于Caffe的DeepID2实现(上)

    小喵的唠叨话:小喵最近在做人脸识别的工作,打算将汤晓鸥前辈的DeepID,DeepID2等算法进行实验和复现.DeepID的方法最简单,而DeepID2的实现却略微复杂,并且互联网上也没有比较好的资源 ...

  2. eCharts 数据转换json

    public ActionResult ShowChart() { return View(); } <div id="main" style="width:600 ...

  3. 设计模式学习之路&mdash;&mdash;Decorator装饰模式(结构模式)

    子类复子类,子类何其多 假如我们需要为游戏中开发一种坦克,除了各种不同型号的坦克外,我们还希望在不同场合中为其增加以下一种或多种功能:比如红外线夜视功能,比如水陆两栖功能,比如卫星定位功能等等. 动机 ...

  4. 二进制配置文件为什么比json等配置文件效率高

    二进制配置文件为什么比json等配置文件高效 项目中用spine做动画,spine可以导出json和二进制的动画配置文件,蛋疼的是spine官方竟然没有提供c的二进制配置解析代码,更没有提供它二进制文 ...

  5. 用上CommonMark.NET,.NET平台终于有了好用的markdown引擎

    缺少好用的markdown引擎之前一直是.NET平台上的一个痛点.因为这个痛点,我们被迫痛苦地使用了pandoc--不是pandoc做的不好,而是pandoc是由Haskell开发的,只能在Windo ...

  6. HTML5学习总结-番外05 响应式布局

    1. 响应式布局 响应式布局是2015年5月份提出的一个概念,简而言之,就是一个网站能够兼容多个终端,而不是为每个终端做一个特定的版本.这个概念是为解决移动互联网浏览而诞生的.其目的是为用户提欧共更加 ...

  7. 转:java怎么用一行代码初始化ArrayList

    java怎么用一行代码初始化ArrayList 您可以创建一个工厂方法: public static ArrayList<String> createArrayList(String .. ...

  8. 为什么要用 Bootstrap

    [Bootstrap](http://hovertree.com/menu/bootstrap/) 是由两个 twitter 员工开发并开源的前端框架,非常火爆,而如此火爆自然有它的道理,在我们团队的 ...

  9. 【JAVA集合框架之工具类】

    一.概述 JAVA集合框架中有两个很重要的工具类,一个是Collections,另一个是Arrays.分别封装了对集合的操作方法和对数组的操作方法,这些操作方法使得程序员的开发更加高效. public ...

  10. 自己动手做Web框架—MVC+Front Controller

    在我前面一篇博文<逃脱Asp.Net MVC框架的枷锁,使用Razor视图引擎>发表之后,很多人关心,脱离了之后怎么办?那么这可以说是它的续篇了. 同时,这也是eLiteWeb开源软件的一 ...