链栈

作者: lxr_ | 来源:发表于2022-04-03 21:29 被阅读0次

1.链表的头指针就是栈顶
2.不需要头结点
3.基本不存在栈满情况
4.空栈相当于头指针指向空
5.插入和删除仅在栈顶处执行,链栈中的操作大部分都和单链表类似,只是插入和删除特殊一些
Note:链栈中指针的方向
如下图所示:

image.png

LinkStack.h

#pragma once
#include <iostream>
using namespace std;

#define MAXSIZE 20
// 函数结果状态代码
#define OK      1
#define ERROR   0
#define INFEASIBLE  -1
#define OVERFLOW    -2

//Status 是函数的类型,其值是函数结果状态代码
typedef int Status;

//数据类型
typedef int SElemType;

typedef struct StackNode
{
    SElemType data;
    struct StackNode* next;
}StackNode, * LinkStack;

//链栈初始化
void InitStack(LinkStack& S);

//判断链栈是否为空
bool StackEmpty(LinkStack S);

//链栈的入栈
Status Push(LinkStack& S, SElemType e);

//链栈的出栈
Status Pop(LinkStack& S, SElemType& e);

//链栈的遍历
void StackTraverse(LinkStack S);

//取栈顶元素
SElemType GetTop(LinkStack S);

LinkStack.cpp

#include "LinkStack.h"

//链栈初始化
void InitStack(LinkStack& S)
{
    //构造一个空栈,栈顶指针值为空
    S = NULL;
}

//判断链栈是否为空
bool StackEmpty(LinkStack S)
{
    if (!S)
    {
        return true;
    }
    return false;
}

//链栈的入栈
Status Push(LinkStack& S, SElemType e)
{
    StackNode* p = new StackNode;
    p->data = e;
    p->next = S;

    S = p;

    return OK;
}

//链栈的出栈
Status Pop(LinkStack& S, SElemType& e)
{
    if (StackEmpty(S))
    {
        cout << "栈为空" << endl;
        return ERROR;
    }

    StackNode* p = S;
    e = p->data;
    S = S->next;

    delete p;

    return OK;
}

//链栈的遍历
void StackTraverse(LinkStack S)
{
    StackNode* p = S;

    while (p)
    {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}

//取栈顶元素
SElemType GetTop(LinkStack S)
{
    if (S)
    {
        return S->data;
    }
    return ERROR;
}

main.cpp

测试:

#include "LinkStack.h"

int main(int argc, char** argv)
{
    LinkStack S;
    InitStack(S);       //初始化链栈

    Push(S, 1);         //入栈
    Push(S, 2);
    Push(S, 3);

    StackTraverse(S);   //遍历

    SElemType e;
    Pop(S, e);          //出栈
    cout << "出栈的元素:" << e << endl;

    //获取栈顶元素
    cout << "栈顶元素为:" << GetTop(S) << endl;

    return 0;
}

相关文章

  • 【数据结构】【C#】006-栈:💫链栈

    C#数据结构:链栈 1、自定义链栈结构: 链栈节点类 链栈类 链栈测试用例: 输出结果: 注意: 1、链栈即采用链...

  • 链栈的操作

    链栈的定义 链栈的操作 初始化 判断栈空 入栈 出栈

  • python数据结构实现(栈和链栈)

    栈 链栈

  • 栈和队列

    栈和队列 本质上是稍加限制的线性表 栈和队列定义 栈顺序栈定义 链栈结点定义 队列顺序队列 链队列链队类型定义 链...

  • 链栈的表示和实现

    链栈的存储结构 链栈的初始化 链栈的入栈 (1)为入栈元素e分配空间,用指针p指向。(2)将新结点数据域置为e。(...

  • 概念 栈是一种后进先出的线性表(LIFO),根据存储结构可以分为顺序栈和链栈。 1. 顺序栈 2.链栈

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

    链栈,即用链表实现栈存储结构。链栈的实现思路同顺序栈类似,顺序栈是将数顺序表(数组)的一端作为栈底,另一端为栈顶;...

  • 堆栈(Stack)---链表实现

    栈的链式存储结构实际上就是一个单链表,叫做链栈。插入和删除操作只能在链栈的栈顶进行。

  • 数据结构的各种代码

    第 02 章 线性表 顺序存储结构 链式存储结构 第 03 章 栈与队列 顺序栈 链栈 两栈共享空间 循环队列 链...

  • 栈(链栈)

    栈:限定只能在表尾进行插入和删除的线性表。 链栈:使用链表表示的栈。 链栈特性: 只能栈顶插入和删除元素。 无需预...

网友评论

      本文标题:链栈

      本文链接:https://www.haomeiwen.com/subject/fiipdrtx.html