栈的实现:链式栈

栈的链式存储,即链式栈。它相比于顺序栈,

优点:

  1. 插入、删除灵活 (不必移动节点,只要改变节点中的指针指向即可)。
  2. 逻辑上相邻的节点物理上不必相邻。

缺点:

  1. 比顺序存储结构的存储密度小 (每个节点都由值域和链域组成,使用指针来表现前后节点的逻辑关系)。
  2. 查找节点时链式存储要比顺序存储慢。

这些优点、缺点体现了顺序存储和链式存储的相区别之处。

看图就很形象了:

下面来看一个链式栈的实现:

类定义和类实现

#include<iostream>
using namespace std;
typedef int ElemType;
typedef struct stacknode   //栈节点类型
{
    ElemType data;   //值域
    struct stacknode *next;  //链域
}StackNode;
class LinkStack   //链式堆栈
{
    private:
    StackNode *stop;  //栈顶指针
    int num;    //栈中节点个数
    public:
    LinkStack();   //默认构造函数
    LinkStack(const LinkStack &stack);   //拷贝构造函数
    ~LinkStack();  //析构函数
    int size();   //获取栈节点个数
    bool empty();   //判断栈是否为空
    StackNode* top();   //获取栈顶元素
    void pop();    //出栈
    void push(ElemType data);   //入栈
    void clear();    //栈清空
    void stackTraverse(void(*)(StackNode *));   //遍历栈
};
//类实现
LinkStack::LinkStack()   //构建空栈
{
     stop=NULL;
     num=0;
}
LinkStack::LinkStack(const LinkStack &stack)   //拷贝构造函数
{
    if(stop)   //如果不为空,应该清除节点,释放内存
    clear();
    if(stack.stop)
    {
        StackNode *pnode,*p=stack.stop;
        stop=pnode=new StackNode;
        pnode->data=p->data;
        p=p->next;
        while(p)
        {
            pnode->next=new StackNode;
            pnode=pnode->next;
            pnode->data=p->data;
            p=p->next;
        }
        pnode->next=NULL;
        num=stack.num;
    }
    else
    LinkStack();
}
LinkStack::~LinkStack()  //析构函数
{
    StackNode *p,*q;
    p=stop;
    while(p)
    {
        q=p->next;
        delete p;
        p=q;
    }
}
int LinkStack::size()   //获取栈大小
{
    return num;
}
bool LinkStack::empty()
{
    return num==0;   //判断栈是否为空
}
StackNode* LinkStack::top()   //获取栈顶元素
{
    if(stop)
    return stop;
    else
    return NULL;
}
void LinkStack::pop()  //出栈
{
    if(stop)
    {
        StackNode *p=stop;
        stop=stop->next;
        delete p;
        num--;
    }
}
void LinkStack::push(ElemType data)   //入栈
{
    StackNode *p=new StackNode;
    p->data=data;
    p->next=stop;
    stop=p;
    num++;
}
void LinkStack::clear()   //栈清空
{
    num=0;
    StackNode *p,*q;
    p=stop;
    while(p)
    {
        q=p->next;
        delete p;
        p=q;
    }
    stop=NULL;
}
void LinkStack::stackTraverse(void(*visit)(StackNode *))   //遍历栈
{
    StackNode *p=stop;
    while(p)
    {
        visit(p);
        p=p->next;
    }
    printf("\n");
}
void visit(StackNode *node)
{
    printf("%-4d",node->data);
}  

主函数

int main()
{
	cout<<"栈的实现:链式栈"<<endl;
	LinkStack stack;
	int data;
	cout<<"入栈,输入0结束!"<<endl;
	while(cin>>data && data)
		stack.push(data);
	printf("遍历栈\n");
	stack.stackTraverse(visit);
	StackNode *pnode=stack.top();
	printf("获取栈顶 %-4d\n",pnode->data);
	stack.pop();
	printf("出栈,遍历栈\n");
	stack.stackTraverse(visit);
	//使用拷贝构造函数
	LinkStack s;
	s=stack;
	printf("测试拷贝构造函数\n");
	printf("遍历栈\n");
	s.stackTraverse(visit);
	printf("栈中元素个数是 %d\n",s.size());
	stack.clear();
	printf("栈清空后,栈是否为空?\n");
	stack.empty()?printf("Yes!\n"):printf("No!\n");
	system("pause");
	return 0;
}

运行:

完整代码下载:栈的实现:链式栈

小结:

如果清楚了链表的操作,实现链式栈是很简单的。单向链表的各种操作是基础。其它的线性表上的操作无非是单向链表操作的子集。当然,实际问题适合什么样的存储结构,就设计相应的物理结构。

栈的实现:链式栈

时间: 2025-01-14 14:14:12

栈的实现:链式栈的相关文章

栈实验

node.h #ifndef __NODE_H__ #define __NODE_H__ // 结点类模板 template <class ElemType> struct Node { // 数据成员: ElemType data; // 数据域 Node<ElemType> *next; // 指针域 }; #endif lk_stack.h #ifndef __LINK_STACK_H__ #define __LINK_STACK_H__ #include "nod

数据结构基础(13) --链式栈的设计与实现

采用链式存储的栈成为链式栈(或简称链栈), 链栈的优点是便于多个栈共享存储空间和提高其效率, 且不存在栈满上溢的情况(因为链栈是靠指针链接到一起,只要内存够大, 则链栈理论上可以存储的元素是没有上限的); 与顺序栈相比, 由于顺序栈是采用的数组实现, 因此一旦数组填满, 则必须重新申请内存, 并将所有元素"搬家", 而链栈则省略了这一"耗时耗力"的工作, 但却需要付出附加一个指针的代价; 链栈通常采用单链表实现, 并规定所有的操作都必须实在单链表的表头进行, 而且w

栈的基础

1.栈的基础概念 a.栈是限制在表的一端进行插入(进栈)和删除(出栈)运算的线性表,而进行这两个操作,需要一个头指针.b.通常称插入,删除的这一端为栈顶,另一端为栈底.c.当表中没有元素时称为空栈.假设栈S=(a1,a2,...an),a1称为栈底元素,an称为栈顶元素. 注意:栈是按后进先出的原则进行的,所以,栈称为后进先出(先进后出)表. 2.栈的实现--顺序栈 栈抽象数据结构 栈接口, 描述栈抽象数据类型,泛型参数T表示数据元素的数据类型: package com.clarck.datas

数据结构和算法-栈

栈可以分为 顺序栈: 数组实现 链式栈: 链表实现 空间复杂度 栈的空间复杂度: 有一个n个元素的栈, 在入栈和出栈过程中, 只需要存储一个临时变量存储空间, 所以空间复杂度是O(1) 并不是说栈有n个元素, 空间复杂度就是O(n), 而是指除了原本的空间外, 算法需要的额外空间 栈要满足后进先出(LIFO)的特性, 栈有以下几种方法 判断为空isEmpty 入栈push 出栈pop 返回栈顶元素peek 返回栈大小size 是否是空isEmpty 以下是使用列表来模拟栈的操作 # coding

21-堆栈

Stack(栈) 栈的结构: 下面是数据结构的集中类型: 1 struct stu //链表 2 { 3 int data; //抽象出的一种数据 4 struct stu *pnext; //链表的指针 5 }; 6 7 struct //顺序表 8 { 9 int data[100]; 10 int size; //顺序表大小标志 11 }; 12 13 struct //顺序结构的栈 14 { 15 int data[100]; 16 int top; //栈顶标志 17 }; 顺序结构的

嵌入式编程相关专业英语积累

ARM芯片手册相关英语 overview         概述 DAT                 data(数据) CON                control(控制) parity                奇偶校验 odd parity        奇校验 even parity        偶校验 trigger               触发 infrared             红外线 poll                   查询 generated 

七方件业金离以提领前群约会ODjdidtlwfWv

为了从不同环节,尤其与广大使用人群直接关系的环节反映质量状况,对共享自行车投放点.运营仓库.生产企业等不同环节的产品抽查,覆盖了共享自行车从成品出厂到待投放的关键环节. 该负责人称,根据新车投放情况,结合共享自行车行业市场占有分布特点,本次重点抽查了摩拜.ofo.Hellobike三个品牌的产品,占本次抽查批次总数的83.3%.其中,在天津.无锡.武汉.广州.深圳.东莞6个城市抽查了9批次摩拜产品,占产品抽查批次总数的37.5%,抽查批次合格率88.9%,抽查不合格的1批次产品为待投放于广州市的

[数据结构]栈之链式栈的类模板实现

栈的抽象基类的实现:(不用抽象基类也是可以的,为了使用虚函数方便) #ifndef STACK #define STACK //栈的抽象基类 template<class T> class Stack { public: Stack(){} ~Stack(){} virtual void Push(const T& x)=0; virtual bool Pop(T& x)=0; virtual bool getTop(T& x)const=0; virtual bool

Java的顺序栈和链式栈

栈的定义 栈是限制在表的一段进行插入和删除的运算的线性表,通常能够将插入.删除的一端为栈顶,例外一端称为栈底,当表中没有任何元素的时候称为空栈. 通常删除(又称"退栈")叫做弹出pop操作,每次删除的都是栈顶最新的元素:每次插入(又称"进栈")称为压入push操作. 当栈满的时候,进行push 操作,会上溢,当空栈的时候进行退栈操作的时称为下溢. 上溢是一种出错的情况,下溢可能是正常的情况处理. 堆栈的运算是按照后进先出的原则,简称LIFO. 栈的基本运算定义: i