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

连续实现的栈与链式实现的栈的最大不同在于,前者使用一个确定大小的数组存储每一个栈元素,后者使用带指针的自定义结构(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. JavaScript----Js操控-HTML5 &lt;progress&gt; 标签

    Js操控----HTML5 <progress> 标签 简单模拟下下载进度跑条 <h4>加载进度</h4> <input type="button& ...

  2. 箭头函数 Arrow Functions/////////////////////zzz

    箭头符号在JavaScript诞生时就已经存在,当初第一个JavaScript教程曾建议在HTML注释内包裹行内脚本,这样可以避免不支持JS的浏览器误将JS代码显示为文本.你会写这样的代码: < ...

  3. re模块汇总

    text = 'The Attila the hun show' m = re.match('.',text)#任意单个字符 m.group() 'T' m = re.match('.*',text) ...

  4. 将asp.net webapi的运行时版本由4.0升级到4.5.1时遇到的问题及解决

    更新package 更改.net运行时的版本之后,出现了错误提示,说需要改新以下组件: EntityFramework, EntityFramework.zh-Hans, Microsoft.AspN ...

  5. java中常用的工具类(一)

    我们java程序员在开发项目的是常常会用到一些工具类.今天我汇总了一下java中常用的工具方法.大家可以在项目中使用.可以收藏!加入IT江湖官方群:383126909 我们一起成长 一.String工 ...

  6. js的隐含参数(arguments,callee,caller)使用方法

    在提到上述的概念之前,首先想说说javascript中函数的隐含参数: arguments arguments 该对象代表正在执行的函数和调用它的函数的参数.[function.]arguments[ ...

  7. 验证坐标在某片坐标区域内 php 代码

    之前碰到的这样一个需求,要将公司的服务范围在地图中显示出来,并将用户每天的访问坐标进行统计看有多少用户是在所能达到的服务范围半径内. 以下是PHP代码的实现 (仅验证坐标在某片坐标区域内) <? ...

  8. Android的CursorLoader用法小结

    工作内容集中到Contact模块,这个应用查询数据的地方很多,其使用了CursorLoader这个工具大大简化了代码复杂度.Android自3.0提供了Loader机制,当时google的API只是简 ...

  9. MapReduce中使用SequenceFile的方式上传文件到集群中

    如果有很多的小文件,上传到HDFS集群,每个文件都会对应一个block块,一个block块的大小默认是128M,对于很多的小文件来说占用了非常多的block数量,就会影响到内存的消耗, MapRedu ...

  10. 10个强大的Apache开源模块

    1.单点登录模块 LemonLDAP LemonLdap可以很棒地实现Apache的SSO功能,并且可以处理超过 20 万的用户请求.LemonLdap支持Java, PHP, .Net, Perl, ...