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

连续实现的栈与链式实现的栈的最大不同在于,前者使用一个确定大小的数组存储每一个栈元素,后者使用带指针的自定义结构(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. 数据结构11: 栈(Stack)的概念和应用及C语言实现

    栈,线性表的一种特殊的存储结构.与学习过的线性表的不同之处在于栈只能从表的固定一端对数据进行插入和删除操作,另一端是封死的. 图1 栈结构示意图 由于栈只有一边开口存取数据,称开口的那一端为“栈顶”, ...

  2. Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现

    栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...

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

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

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

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

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

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

  6. 算法与数据结构基础 - 堆栈(Stack)

    堆栈基础 堆栈(stack)具有“后进先出”的特性,利用这个特性我们可以用堆栈来解决这样一类问题:后续的输入会影响到前面的阶段性结果.线性地遍历输入并用stack处理,这类问题较简单,求解时间复杂度一 ...

  7. java数据结构——栈(Stack)

    学习数据结构与算法是枯燥的,但只有坚持不懈的积累,才会有硕果累累的明天. /** * 继续学习Java数据结构 ————栈 * 栈的实现其实还是使用数组,只不过我们不能直接访问数组下标,而是通过一个指 ...

  8. 数据结构 -- 栈(Stack)

    一.栈的简介 定义 栈(英语:stack)又称为堆栈或堆叠,栈作为一种数据结构,它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据 ...

  9. 第二十三篇 玩转数据结构——栈(Stack)

          1.. 栈的特点: 栈也是一种线性结构: 相比数组,栈所对应的操作是数组的子集: 栈只能从一端添加元素,也只能从这一端取出元素,这一端通常称之为"栈顶": 向栈中添加元 ...

随机推荐

  1. 通配符+countif()解决大于15位数的计数问题

    excel的最大精度是15位,如果一个单元格中存储的数字超过15位,那么函数在计算的时候将会出现问题,它们会将15位之后的数字变成0. 在这种情况下,需要在函数中加入通配符,例如,统计A列中,A1出现 ...

  2. WPF:linq

    /// <summary> /// 该药品是否存在发药信息 /// 存在返回true,否则返回false /// </summary> /// <param name=& ...

  3. 课程设计(部分代码)之java版(记事本)

    /* *java课程设计之记事本(coder @Gxjun) * 编写一个记事本程序 * 要求: * 用图形用户界面实现. * 能实现编辑.保存.另存为.查找替换等功能. * 提示:使用文件输入输出流 ...

  4. IE5,IE6,IE7,IE8的css兼容性列表[转自MSDN]

    CSS 2.1:   IE 5.0 IE 5.5 IE 6.0 IE 7.0 IE8 Beta 1 IE8 Beta 2 IE 8.0 @charset No Yes Yes Yes Yes Yes ...

  5. for循环的嵌套——7月24日

      练习一:输入一个正整数,用for循环嵌套求阶乘的和 //输入一个正整数,求1!+2!+....+n! 用for循环嵌套 Console.Write("请输入一个正整数:"); ...

  6. UESTC 2016 Summer Training #1 Div.2

    最近意志力好飘摇..不知道坚不坚持得下去.. 这么弱还瞎纠结...可以滚了.. 水题都不会做.. LCS (A) 水 LCS (B) 没有看题 Gym 100989C 水 1D Cafeteria ( ...

  7. Octopus系列之接下来的任务

    更新默认国家[已实现] 更新每页显示条数的后台控制[已实现] 更新国家和区域的Ajax的关联[已实现] 更新详情页面的 属性选择 脚本提示[已实现 可以做到和兰亭一样的效果了] 增加优惠方案的设置和批 ...

  8. 一步一步配置NLB

    废话不说,配置NLB需要准备以下环境: 1. 至少两个服务器,我的是windows server 2008 R2; 我的两个服务器名分别为NLB3和NLB2,其中NLB3是主,为什么呢?后面会谈到,在 ...

  9. php不解析的排查步骤

    php不解析的排查步骤:1. /usr/local/apache2/bin/apachectl -M 看一下有没有加载libphp5.so2. 查看配置文件中是否有 AddType applicati ...

  10. qml的打包问题

    qml2的打包问题: 相对于早期的项目,只需要打包plugin和动态库.带有sqlite的程序如果需要打包,需要打包如下东西: 1.打包AppData目录下的  Local/Qt Project/项目 ...