前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据结构 第6讲 链栈

数据结构 第6讲 链栈

作者头像
rainchxy
发布2018-09-13 15:59:02
4930
发布2018-09-13 15:59:02
举报
文章被收录于专栏:趣学算法趣学算法

数据结构 第6讲 链栈

进出的一端称为栈顶(top),另一端称为栈底(base)。栈可以用顺序存储,也可以用链式存储。顺序栈和链栈图解:

顺序栈是分配一段连续的空间,需要两个指针,base指向栈底,top指向栈顶。而链栈每个结点的地址是不连续的,只需要一个栈顶指针即可。

从上图可以看出,链栈的每个结点都包含两个域,数据域和指针域,是不是和单链表一模一样?那么我们就可以按单链表的定义。

链栈的结构体定义:

链栈的结点定义和单链表一样,只不过它只能在栈顶操作而已。

下面讲解链栈的初始化、入栈,出栈,取栈顶元素等操作(元素以int类型为例)。

1. 链栈初始化

初始化一个空栈,只需要让栈顶指针为空即可。

代码语言:javascript
复制
bool InitStack(LinkStack &S) //构造一个空栈S
{
    S=NULL; 
    return true;
}

2. 入栈

入栈前要创建一个新结点,将元素e存入该结点的数值域:

p = new Snode; //生成新结点

p->data = e; //将e放在新结点数据域

然后将该结点的指针域指向S,再修改S指针指向该结点。

代码语言:javascript
复制
bool Push(LinkStack &S, int e) //在栈顶插入元素e
{
    LinkStack p;
    p = new Snode; //生成新结点
    p->data = e; //将e放在新结点数据域
    p->next = S; //将新结点的指针域指向S,即将S的地址赋值给新结点的指针域
    S = p; //修改栈顶指针为p
    return true;
}

3. 出栈

出栈就是要把栈顶元素删除,让栈顶指针指向下一个结点,然后释放该结点空间。因此先用指针p指向栈顶元素(S指针指向的结点),即p=S;然后栈顶指针S指向它的下一个结点,即S=S->next;最后释放p指向的结点,即delete p。

代码语言:javascript
复制
bool Pop(LinkStack &S, int &e) //删除S的栈顶元素,用e保存其值
{  
    LinkStack p;
    if (S == NULL) //栈空
        return false; 
    e = S->data; //将栈顶元素赋给e
    p = S; //用p保存栈顶元素地址,以备释放
    S = S->next; //修改栈顶指针,指向下一个结点
    delete p; //释放原栈顶元素的空间
    return true;
}

4. 取栈顶元素

取栈顶元素和出栈不同,取栈顶元素只是把栈顶元素复制一份,栈顶指针并没有改变,而出栈是指删除栈顶元素,栈顶指针指向了下一个元素。

代码语言:javascript
复制
int GetTop(LinkStack S) //返回S的栈顶元素,不修改栈顶指针
{  
    if (S != NULL) //栈非空
        return S->data; //返回栈顶元素的值,栈顶指针不变
else
return -1;
}

链栈基本操作完整代码:

代码语言:javascript
复制
完整代码:
#include<iostream>
using namespace std;
typedef struct Snode {
    int data; //数据域
    struct Snode *next; //指针域
}Snode,*LinkStack;
bool InitStack(LinkStack &S) //构造一个空栈S
{
    S=NULL;
    return true;
}
bool Push(LinkStack &S, int e) //在栈顶插入元素e
{
    LinkStack p;
    p = new Snode; //生成新结点
    p->data = e; //将e放在新结点数据域
    p->next = S; //将新结点的指针域指向S,即将S的地址赋值给新结点的指针域
    S = p; //修改栈顶指针为p
    return true;
}
bool Pop(LinkStack &S, int &e) //删除S的栈顶元素,用e保存其值
{
    LinkStack p;
    if (S==NULL) //栈空
        return false;
    e=S->data; //将栈顶元素赋给e
    p=S; //用p保存栈顶元素地址,以备释放
    S=S->next; //修改栈顶指针,指向下一个结点
    delete p; //释放原栈顶元素的空间
    return true;
}
int GetTop(LinkStack S) //返回S的栈顶元素,不修改栈顶指针
{
    if (S!=NULL) //栈非空
        return S->data; //返回栈顶元素的值,栈顶指针不变
else
return -1;
}
int main()
{
    int n,x;
    LinkStack S;
    InitStack(S);//初始化一个顺序栈S
    cout <<"请输入元素个数n:"  <<endl;
    cin>>n;
    cout <<"请依次输入n个元素,依次入栈:"  <<endl;
    while(n--)
{
        cin>>x; //输入元素
        Push(S, x);
    }
    cout <<"元素依次出栈:" <<endl;
    while(S!=NULL)//如果栈不空,则依次出栈
{
cout<<GetTop(S)<<"\t";//输出栈顶元素
Pop(S, x); //栈顶元素出栈
}
    return 0;
}

运行结果:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年10月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档