之前对顺序栈写了基本操作,认为有必要也动手练练栈的链表实现。

对于链栈,一般不会出现栈满的情况。

链栈头文件定义例如以下:

#ifndef CSTOCK_H_
#define CSTOCK_H_ typedef int elemType; struct Item
{
elemType data;
Item * p_next;
};
class CStock
{
public:
CStock();
CStock(const CStock & otherStock); //拷贝构造函数;
CStock & operator = (const CStock & otherStock); //=运算符重载。
void push(elemType x);//进栈操作;
bool pop(elemType &x); //出栈操作;
bool isEmpty() const; //推断栈空;
void clear();//清空栈。使栈为空;
int size() const; //获得栈的大小。
void print() const; //打印栈内元素; ~CStock(); public:
Item *p_Top;//栈顶
}; #endif

实现的基本功能例如以下:

#include "CStock.h"
#include <iostream>
using std::cout;
using std::endl; CStock::CStock(): p_Top(NULL)//构造函数
{ }
//拷贝构造函数 便于定义时初始化,如 CStock s1 = stock; 默认的会出现潜在问题
CStock::CStock(const CStock & otherStock):p_Top(NULL)
{
*this = otherStock;
}
// =运算符重载,便于赋值,如:CStock s1; .... CStock s2; s2 = s1; 默认的会出现潜在问题。 我写的这种方法认为不好,有好的写法希望大神能指导指导。
CStock & CStock::operator =(const CStock & otherStock)
{
CStock tempStock;
Item * copyElement = otherStock.p_Top;
//将栈otherStock的元素出栈,依次进入tempStock内,元素的位置顺序和otherStock相反;
while(copyElement)
{
tempStock.push(copyElement->data);
copyElement = copyElement->p_next;
} copyElement = tempStock.p_Top;
//将tempStock的元素出栈,依次进入此栈内,元素位置和otherStock同样。
while(copyElement)
{
push(copyElement->data);
copyElement = copyElement->p_next;
} return *this; }
//进栈操作
void CStock::push(elemType x)
{
Item * pushElement = new Item;
pushElement->data = x; if(!p_Top)//假设栈为空时
{
p_Top = pushElement;
pushElement->p_next = NULL;
}
else //若栈不为空时
{
pushElement->p_next = p_Top;
p_Top = pushElement;
}
} //出栈操作,若栈不为空。数据有形參x带至主调函数,出栈失败函数返回false;
bool CStock::pop(elemType &x)
{
if(!p_Top)
{
return false;
} x = p_Top->data;
p_Top = p_Top->p_next; return true;
} //推断栈是否为空
bool CStock::isEmpty() const
{
return p_Top == NULL;
} //清空栈,使栈置为空栈
void CStock::clear()
{
Item * deleteElement;
while(p_Top)
{
deleteElement = p_Top;
p_Top = p_Top->p_next;
delete deleteElement;
}
} //获得栈的大小
int CStock::size() const
{
int length = 0;
Item *temp = p_Top; while(temp && ++length)
{
temp = temp->p_next;
} return length;
} //打印栈内元素
void CStock::print() const
{
int count = 0;
Item * temp = p_Top; while(temp && ++count)
{
cout << temp->data << "\t";
if(count % 5 == 0)
cout << endl; temp = temp->p_next;
}
}
//析构函数,提供对指针成员的释放,默认的会出现潜在问题
CStock::~CStock(void)
{
Item * deleteElement;
while(p_Top)
{
deleteElement = p_Top;
p_Top = p_Top->p_next;
delete deleteElement;
}
}

C++实现链栈的基本操作的更多相关文章

  1. 链栈的基本操作(C语言)

    栈的链式储存结构称为链栈.链栈的节点类型与链式线性表的节点类型 定义相同,不同的是它是仅在表头进行操作的单链表.链栈通常用不带头节 点的单链表来实现,栈顶指针就是链表的头指针 ,如图所示: 代码如下: ...

  2. C语言实现链栈以及基本操作

    链栈,即用链表实现栈存储结构.链栈的实现思路同顺序栈类似,顺序栈是将数顺序表(数组)的一端作为栈底,另一端为栈顶:链栈也如此,通常我们将链表的头部作为栈顶,尾部作为栈底,如下下图所示: 将链表头部作为 ...

  3. 数据结构——Java实现链栈

    一.分析 栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表. 链栈是指采用链式存储结构实现的 ...

  4. C++ 栈的基本操作

    // zhan.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namesp ...

  5. PHP数据结构之五 栈的PHP的实现和栈的基本操作

    栈和队列是两种应用非常广泛的数据结构,它们都来自线性表数据结构,都是“操作受限”的线性表. 栈栈在计算机的实现有多种方式:硬堆栈:利用CPU中的某些寄存器组或类似的硬件或使用内存的特殊区域来实现.这类 ...

  6. 【C#】【数据结构】006-栈:链栈

    C#数据结构:链栈 1.自定义链栈结构: 链栈节点类 using System.Collections; using System.Collections.Generic; using UnityEn ...

  7. 数据结构 - 链栈的实行(C语言)

    数据结构-链栈的实现 1 链栈的定义 现在来看看栈的链式存储结构,简称为链栈. 想想看栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它 ...

  8. 数据结构 - 链栈的实现 C++

    链栈封装 C++ 使用C++对链栈进行了简单的封装,实现了栈的基本操作 封装方法: pop(),top(),size(),empty(),push() 代码已经过测试 #pragma once #in ...

  9. 03链栈_LinkStack--(栈与队列)

    #include "stdio.h" #include "stdlib.h" #include "io.h" #include " ...

随机推荐

  1. Tui-x简单介绍

    1.什么是Tui-x Tui-x是一个创建cocos2d-x UI界面的解决方式,而builder用的则是FlashCS,通过使用jsfl来拓展FlashCS从而达到UI编辑器的功能.这个jsfl所做 ...

  2. HTML5 input placeholder 颜色 改动

    David Murdoch:Chrome支持input=[type=text]占位文本属性,但下列CSS样式却不起作用: CSS input[placeholder], [placeholder], ...

  3. Swift - 做一个简单的无线U盘(手机端Http服务器搭建)

    由于iOS系统的封闭性,在数据传输方面十分不方便.不像安卓设备,直接连接电脑就能当U盘使用.所以一般我们如果用iPhone临时存取个东西,要么使用数据线连接iTunes,要么手机电脑都登上QQ,使用Q ...

  4. android使用xfire webservice框架远程对sqlserver操作(包括增删改查)的实例!!已在真机上试验通过

    前两天,公司有一个利用android远程操作sqlserver的项目,对此我是毫无头绪的,但也挺感兴趣的,于是开始上网搜索方法,网上有挺多方法了,发现使用webservice的挺多的,不过我对这些技术 ...

  5. iPhone App开发实战手册学习笔记(9)之设计IOS App的目标

    1 前言 如果我们要做一个属于自己的App需要达到那些目标呢,今天就来介绍一下. 2 详述 2.1 关注用户及其需求 你的主要目标永远都是在设计方案之前先想好用户用例.有些开发人员喜欢编写用户故事来确 ...

  6. android在eclipse中打包(签名包)方法及常见问题解决

    打包成apk 右键单击项目名称,选择"Android Tools".再选择"Export Signed Application Package-",例如以下图所 ...

  7. 初识JAVA,对servlet的理解

    一.WEB开发的简单理解 Web开发是一个指代网页或站点编写过程的广义术语.网页使用 HTML.CSS 和 JavaScript编写.这些页面可能是类似于文档的简单文本和图形.页面也能够是交互式的,或 ...

  8. POJ 3835 &amp; HDU 3268 Columbus’s bargain(最短路 Spfa)

    题目链接: POJ:http://poj.org/problem?id=3835 HDU:http://acm.hdu.edu.cn/showproblem.php?pid=3268 Problem ...

  9. Oracle ACL(Access Control List)

    在oralce 11g中假如你想获取server的ip或者hostname,执行如下语句 SELECT utl_inaddr.get_host_address FROM dual;  //获取IP S ...

  10. 与众不同 windows phone (29) - Communication(通信)之与 OData 服务通信

    原文:与众不同 windows phone (29) - Communication(通信)之与 OData 服务通信 [索引页][源码下载] 与众不同 windows phone (29) - Co ...